SpringBoot神器-------CommandLineRunner 解決項目啓動時初始化資源

在我們實際工作中,總會遇到這樣需求,在項目啓動的時候需要做一些初始化的操作,之前介紹過@PostConstruct也可以在項目啓動時做初始化!今天就給大家分享一個 SpringBoot 神器------CommandLineRunner,專門幫助大家解決項目啓動初始化資源操作。CommandLineRunner 接口的 Component 會在所有 Spring Beans都初始化之後,SpringApplication.run() 之前執行,非常適合在應用程序啓動之初進行一些數據初始化的工作。

創建一個Banner1類繼承 CommandLineRunner ,並實現它的 run() 方法。

/**
 * @description 項目啓動時做初始化操作
 * @author zhaoxiaofeng
 *
 */
@Component
@Order(1)
public class Runner1 implements CommandLineRunner{

	@Override
	public void run(String... args) throws Exception {
		// TODO Auto-generated method stub
		 System.out.println("正在加載Runner1 ...");
	}

}

創建一個Banner2類繼承 CommandLineRunner ,並實現它的 run() 方法。

/**
 * @description 啓動項目時做初始化操作
 * @author zhaoxiaofeng
 *
 */
@Component
@Order(2)
public class Runner2 implements CommandLineRunner{

	@Override
	public void run(String... args) throws Exception {
		// TODO Auto-generated method stub
		 System.out.println("正在加載Runner2 ...");
	}

}

啓動類

這裏我將@PostConstruct 也加進來對比一下

@SpringBootApplication
public class AppSwagger {

	public static void main(String[] args) {
		System.out.println("服務正在準備啓動...");
		SpringApplication.run(AppSwagger.class, args);
		System.out.println("服務已經啓動完畢...");
	}
	@PostConstruct//在初始化的時候初始化靜態對象和它的靜態成員變量bean對象,靜態存儲下來,防止被釋放
    public void init() {
		System.out.println("這是@PostConstruct初始化加載...");
	}

}

結果:

服務正在準備啓動...

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.1.RELEASE)

2019-07-10 19:13:53.177  INFO 94080 --- [           main] com.zxf.AppSwagger                       : Starting AppSwagger on zhaoxiaofeng with PID 94080 (E:\java\workspace1\springboot-swagger\target\classes started by lancoo in E:\java\workspace1\springboot-swagger)
2019-07-10 19:13:53.181  INFO 94080 --- [           main] com.zxf.AppSwagger                       : No active profile set, falling back to default profiles: default
2019-07-10 19:13:53.229  INFO 94080 --- [           main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@7dc3712: startup date [Wed Jul 10 19:13:53 CST 2019]; root of context hierarchy
2019-07-10 19:13:54.013  INFO 94080 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2019-07-10 19:13:54.443  INFO 94080 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$5f4c2ee8] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-07-10 19:13:54.740  INFO 94080 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8091 (http)
2019-07-10 19:13:54.765  INFO 94080 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-07-10 19:13:54.765  INFO 94080 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.29
2019-07-10 19:13:54.770  INFO 94080 --- [ost-startStop-1] o.a.catalina.core.AprLifecycleListener   : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [E:\soft\jre\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;E:\soft\jre\bin;E:/soft/jre/bin/server;E:/soft/jre/bin;E:/soft/jre/lib/amd64;E:\database\oracle\app\oracle\product\11.2.0\server\bin;C:\ProgramData\Oracle\Java\javapath;C:\Program Files\Python36\Scripts\;C:\Program Files\Python36\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\CMake\bin;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Intel\computer_vision_sdk_2018.4.420\inference_engine\bin\intel64\Release;E:\soft\jdk\bin;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;D:\Program Files\erl6.4\bin;C:\Program Files\Microsoft SQL Server\100\Tools\binn\;E:\java\maven\apache-maven-3.6.0\bin;E:\C++\OpenCV_3.4.1\opencv\build\x64\vc14\bin;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;D:\Program Files\RabbitMQ Server\rabbitmq_server-3.5.2\sbin;E:\database\Redis-x64-3.2.100;C:\Users\lancoo\AppData\Local\Microsoft\WindowsApps;;E:\java\eclipse;;.]
2019-07-10 19:13:54.863  INFO 94080 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-07-10 19:13:54.863  INFO 94080 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1637 ms
2019-07-10 19:13:55.244  INFO 94080 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2019-07-10 19:13:55.244  INFO 94080 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'sessionRepositoryFilter' to: [/*]
2019-07-10 19:13:55.244  INFO 94080 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2019-07-10 19:13:55.244  INFO 94080 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2019-07-10 19:13:55.244  INFO 94080 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2019-07-10 19:13:55.244  INFO 94080 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Servlet dispatcherServlet mapped to [/]
這是@PostConstruct初始化加載...
2019-07-10 19:13:56.028  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/aop/beforeAdvice]}" onto public java.lang.String com.zxf.controller.AdivceController.beforeAdvice()
2019-07-10 19:13:56.033  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/index],methods=[GET]}" onto public java.lang.String com.zxf.controller.CityController.Index(java.lang.String)
2019-07-10 19:13:56.033  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/findCityById/{id}],methods=[GET]}" onto public com.zxf.entity.City com.zxf.controller.CityController.findCityById(java.lang.Long)
2019-07-10 19:13:56.033  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/saveCity],methods=[POST]}" onto public void com.zxf.controller.CityController.saveCity(com.zxf.entity.City)
2019-07-10 19:13:56.033  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/updateCity],methods=[GET]}" onto public void com.zxf.controller.CityController.updateCity(com.zxf.entity.City)
2019-07-10 19:13:56.034  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/deleteCity/{id}],methods=[GET]}" onto public void com.zxf.controller.CityController.deleteCity(java.lang.Long)
2019-07-10 19:13:56.034  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/sendFilesMail]}" onto public java.lang.String com.zxf.controller.MailController.sendFilesMail()
2019-07-10 19:13:56.035  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/sendTemplateMail]}" onto public java.lang.String com.zxf.controller.MailController.sendTemplateMail()
2019-07-10 19:13:56.035  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/sendMail]}" onto public java.lang.String com.zxf.controller.MailController.sendMail()
2019-07-10 19:13:56.035  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/sendHtmlMail]}" onto public java.lang.String com.zxf.controller.MailController.testHtmlMail()
2019-07-10 19:13:56.035  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/sendInlineResourceMail]}" onto public java.lang.String com.zxf.controller.MailController.sendInlineResourceMail()
2019-07-10 19:13:56.035  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/getSessionId]}" onto public java.lang.String com.zxf.controller.SessionController.getSessionId(javax.servlet.http.HttpSession)
2019-07-10 19:13:56.036  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/deleteInf],methods=[GET]}" onto public java.lang.String com.zxf.controller.SwaggerController.deleteInf(java.lang.String)
2019-07-10 19:13:56.036  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/updateUser],methods=[POST]}" onto public java.lang.String com.zxf.controller.SwaggerController.updateUser(java.lang.String)
2019-07-10 19:13:56.037  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/addUserInf],methods=[POST]}" onto public java.lang.String com.zxf.controller.SwaggerController.addUserInf()
2019-07-10 19:13:56.037  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/upload],methods=[POST]}" onto public java.lang.String com.zxf.controller.UploadController.upload(org.springframework.web.multipart.MultipartFile,javax.servlet.http.HttpServletRequest)
2019-07-10 19:13:56.038  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/uploads],methods=[POST]}" onto public java.lang.String com.zxf.controller.UploadController.uploads(org.springframework.web.multipart.MultipartFile[],javax.servlet.http.HttpServletRequest)
2019-07-10 19:13:56.041  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/swagger-resources/configuration/ui]}" onto public org.springframework.http.ResponseEntity<springfox.documentation.swagger.web.UiConfiguration> springfox.documentation.swagger.web.ApiResourceController.uiConfiguration()
2019-07-10 19:13:56.042  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/swagger-resources]}" onto public org.springframework.http.ResponseEntity<java.util.List<springfox.documentation.swagger.web.SwaggerResource>> springfox.documentation.swagger.web.ApiResourceController.swaggerResources()
2019-07-10 19:13:56.042  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/swagger-resources/configuration/security]}" onto public org.springframework.http.ResponseEntity<springfox.documentation.swagger.web.SecurityConfiguration> springfox.documentation.swagger.web.ApiResourceController.securityConfiguration()
2019-07-10 19:13:56.046  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2019-07-10 19:13:56.046  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2019-07-10 19:13:56.228  INFO 94080 --- [           main] io.lettuce.core.EpollProvider            : Starting without optional epoll library
2019-07-10 19:13:56.230  INFO 94080 --- [           main] io.lettuce.core.KqueueProvider           : Starting without optional kqueue library
2019-07-10 19:13:56.636  INFO 94080 --- [           main] pertySourcedRequestMappingHandlerMapping : Mapped URL path [/v2/api-docs] onto method [public org.springframework.http.ResponseEntity<springfox.documentation.spring.web.json.Json> springfox.documentation.swagger2.web.Swagger2Controller.getDocumentation(java.lang.String,javax.servlet.http.HttpServletRequest)]
2019-07-10 19:13:56.721  INFO 94080 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2019-07-10 19:13:56.921  INFO 94080 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@7dc3712: startup date [Wed Jul 10 19:13:53 CST 2019]; root of context hierarchy
2019-07-10 19:13:56.981  INFO 94080 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2019-07-10 19:13:56.981  INFO 94080 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2019-07-10 19:13:57.459  INFO 94080 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2019-07-10 19:13:57.461  INFO 94080 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Bean with name 'dataSource' has been autodetected for JMX exposure
2019-07-10 19:13:57.468  INFO 94080 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Located MBean 'dataSource': registering with JMX server as MBean [com.zaxxer.hikari:name=dataSource,type=HikariDataSource]
2019-07-10 19:13:57.472  INFO 94080 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Starting beans in phase 2147483647
2019-07-10 19:13:57.472  INFO 94080 --- [           main] d.s.w.p.DocumentationPluginsBootstrapper : Context refreshed
2019-07-10 19:13:57.485  INFO 94080 --- [           main] d.s.w.p.DocumentationPluginsBootstrapper : Found 1 custom documentation plugin(s)
2019-07-10 19:13:57.517  INFO 94080 --- [           main] s.d.s.w.s.ApiListingReferenceScanner     : Scanning for api listing references
2019-07-10 19:13:57.713  WARN 94080 --- [           main] s.d.s.w.r.p.ParameterDataTypeReader      : Trying to infer dataType org.springframework.web.multipart.MultipartFile[]
2019-07-10 19:13:57.774  INFO 94080 --- [           main] s.a.ScheduledAnnotationBeanPostProcessor : No TaskScheduler/ScheduledExecutorService bean found for scheduled processing
2019-07-10 19:13:57.798  INFO 94080 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8091 (http) with context path ''
2019-07-10 19:13:57.804  INFO 94080 --- [           main] com.zxf.AppSwagger                       : Started AppSwagger in 4.91 seconds (JVM running for 5.658)
正在加載Runner1 ...
正在加載Runner2 ...
服務已經啓動完畢...

結論:CommandLineRunner 接口的 Component 會在所有 SpringBeans都初始化之後,SpringApplication.run() 之前執行

         @PostConstruct的啓動時間是在 SpringBeans初始化時執,SpringApplication.run()之前執行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章