Hello大家好,本章我们添加项目启动时初始化资源功能 。有问题可以联系我mr_beany@163.com。另求各路大神指点,感谢
在我们实际工作中,总会遇到这样需求,在项目启动的时候需要做一些初始化的操作,比如读取配置文件信息,数据库连接,清除缓存信息等。在Spring Boot中给我们提供了两个接口来帮助我们实现这样的需求。这两个接口就是我们今天要讲的 CommandLineRunner 和 ApplicationRunner ,他们的执行时机为容器启动完成的时候。
共同点:其一执行时机都是在容器启动完成的时候进行执行;其二这两个接口中都有一个run()方法;
不同点:ApplicationRunner中run方法的参数为ApplicationArguments,而CommandLineRunner接口中run方法的参数为String数组。
创建core→startuprunner→StartupRunner1
package com.example.demo.core.startuprunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Component @Order(value = 1) public class StartupRunner1 implements ApplicationRunner { private static final Logger logger = LoggerFactory.getLogger(StartupRunner1.class); @Override public void run(ApplicationArguments var1) throws Exception{ logger.info("服务器启动成功!<<<<使用ApplicationRunner接口"); } }
注意:需要添加@Component,不然SpringBoot扫描不到这个类,不会执行。
启动服务器,我们可以看见
创建core→startuprunner→StartupRunner2
package com.example.demo.core.startuprunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Component @Order(value = -1) public class StartupRunner2 implements CommandLineRunner { private static final Logger logger = LoggerFactory.getLogger(StartupRunner2.class); @Override public void run(String... args) throws Exception{ logger.info("服务器启动成功!<<<<使用CommandLineRunner接口"); } }
我们可以看见已经输出成功,并且CommandLineRunner 在 ApplicationRunner 先执行
如果有多个实现类,而我们需要按照一定的顺序执行的话,那应该怎么办
解决方案:在实现类上加上@Order注解指定执行的顺序
需要注意:数字越小,优先级越高,也就是@Order(1)注解的类会在@Order(2)注解的类之前执行。
gitee.com/beany/mySpr…
写文章不易,如对您有帮助,请帮忙点下star
添加项目启动时初始化资源功能已完成,后续功能接下来陆续更新,有问题可以联系我mr_beany@163.com。另求各路大神指点,感谢大家。