金烽2|金烽2平台|金烽2注册|金烽2开户|金烽2平台注册

Spring Boot 2 (七):Spring Boot 如何办理项目启动时初始化资源

在我们实际事情中,总会碰着这样需求,在项目启动的时候需要做一些初始化的操纵,好比初始化线程池,提前加载好加密证书等。本日就给各人先容一个 Spring Boot 神器,专门辅佐各人办理项目启动初始化资源操纵。

这个神器就是 CommandLineRunner,CommandLineRunner 接口的 Component 会在所有 Spring Beans 都初始化之后,SpringApplication.run() 之前执行,很是适合在应用措施启动之初举办一些数据初始化的事情。

接下来我们就运用案例测试它如何利用,在测试之前在启动类加两行打印提示,利便我们识别 CommandLineRunner 的执行机缘。

@SpringBootApplication public class CommandLineRunnerApplication { public static void main(String[] args) { System.out.println("The service to start."); SpringApplication.run(CommandLineRunnerApplication.class, args); System.out.println("The service has started."); } }

接下来我们直接建设一个类担任 CommandLineRunner ,并实现它的 run() 要领。

@Component public class Runner implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("The Runner start to initialize ..."); } }

我们在 run() 要领中打印了一些参数来看出它的执行机缘。完成之后启动项目举办测试:

... The service to start. . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=http://www.ityouknow.com/_/_/_/ :: Spring Boot :: (v2.0.0.RELEASE) ... 2018-04-21 22:21:34.706 INFO 27016 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2018-04-21 22:21:34.710 INFO 27016 --- [ main] com.neo.CommandLineRunnerApplication : Started CommandLineRunnerApplication in 3.796 seconds (JVM running for 5.128) The Runner start to initialize ... The service has started.

按照节制台的打印信息我们可以看出 CommandLineRunner 中的要了解在 Spring Boot 容器加载之后执行,执行完成后项目启动完成。

假如我们在启动容器的时候需要初始化许多资源,而且初始化资源彼此之间有序,那如何担保差异的 CommandLineRunner 的执行顺序呢?Spring Boot 也给出了办理方案。那就是利用 @Order 注解。

我们建设两个 CommandLineRunner 的实现类来举办测试:

第一个实现类:

@Component @Order(1) public class OrderRunner1 implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("The OrderRunner1 start to initialize ..."); } }

第二个实现类:

@Component @Order(2) public class OrderRunner2 implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("The OrderRunner2 start to initialize ..."); } }

添加完成之后从头启动,调查执行顺序:

... The service to start. . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=http://www.ityouknow.com/_/_/_/ :: Spring Boot :: (v2.0.0.RELEASE) ... 2018-04-21 22:21:34.706 INFO 27016 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2018-04-21 22:21:34.710 INFO 27016 --- [ main] com.neo.CommandLineRunnerApplication : Started CommandLineRunnerApplication in 3.796 seconds (JVM running for 5.128) The OrderRunner1 start to initialize ... The OrderRunner2 start to initialize ... The Runner start to initialize ... The service has started.

通过节制台的输出我们发明,添加 @Order 注解的实现类最先执行,而且@Order()内里的值越小启动越早。

在实践中,利用ApplicationRunner也可以到达沟通的目标,两着不同不大。看来利用 Spring Boot 办理初始化资源的问题很是简朴。

示例代码-github

示例代码-码云


微信扫描二维码,存眷一个有故事的措施员

keywords:金烽2|金烽2平台|金烽2注册|金烽2开户|金烽2平台注册
天悦
名人
高德
天辰
天辰
恒行
摩登4
星辰
星辰
天富
摩杰
沐鸣2
沐鸣2
恒耀
亿兴
盛图
盛图