在SpringBoot项目启动完成后自动执行某些代码(如初始化某些操作等),有以下2种方式去实现:实现下面2个接口
- org.springframework.boot.ApplicationRunner
- org.springframework.boot.CommandLineRunner
具体实现ApplicationRunner方法的Bean如下:
@Component
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments var1) throws Exception{
System.out.println("实现ApplicationRunner接口");
}
}
具体实现CommandLineRunner方法的Bean如下:
@Component
public class MyCommandLineRunner implements CommandLineRunner{
@Override
public void run(String... var1) throws Exception{
System.out.println("实现CommandLineRunner接口");
}
}
启动项目,默认情况下:先执行ApplicationRunner,在执行CommandLineRunner方法
2020-02-23 20:45:00.955 INFO 18492 --- [ main] o.a.kafka.common.utils.AppInfoParser : Kafka version : 1.0.2
2020-02-23 20:45:00.955 INFO 18492 --- [ main] o.a.kafka.common.utils.AppInfoParser : Kafka commitId : 2a121f7b1d402825
2020-02-23 20:45:00.960 INFO 18492 --- [ main] o.s.s.c.ThreadPoolTaskScheduler : Initializing ExecutorService
2020-02-23 20:45:00.998 INFO 18492 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8899 (http) with context path ''
2020-02-23 20:45:01.003 INFO 18492 --- [ main] c.n.community.crm.CrmWebApplication : Started CrmWebApplication in 9.338 seconds (JVM running for 10.743)
实现ApplicationRunner接口
实现CommandLineRunner接口
当然,也可以通过Spring提供的@Order注解或者Ordered接口来更新Bean执行的顺序,值越小越先执行,比如我们给实现ConnandLineRunner接口的Bean添加注解@Order(1),给实现ApplicationRunner接口的Bean添加@Order(2),再次启动项目的时候我们可以看到:
2020-02-23 20:47:46.947 INFO 25148 --- [ main] o.a.kafka.common.utils.AppInfoParser : Kafka version : 1.0.2
2020-02-23 20:47:46.947 INFO 25148 --- [ main] o.a.kafka.common.utils.AppInfoParser : Kafka commitId : 2a121f7b1d402825
2020-02-23 20:47:46.951 INFO 25148 --- [ main] o.s.s.c.ThreadPoolTaskScheduler : Initializing ExecutorService
2020-02-23 20:47:46.990 INFO 25148 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8899 (http) with context path ''
2020-02-23 20:47:46.995 INFO 25148 --- [ main] c.n.community.crm.CrmWebApplication : Started CrmWebApplication in 8.73 seconds (JVM running for 10.114)
实现CommandLineRunner接口
实现ApplicationRunner接口
当然除了以上2种方式,我们可以里利用Spring中Bean生命周期或者Spring容器的生命周期的相关接口
1.实现ServletContextAware接口并重写其setServletContext方法
@Component public class TestStarted implements ServletContextAware { /** * 在填充普通bean属性之后但在初始化之前调用 * 类似于initializingbean的afterpropertiesset或自定义init方法的回调 * */ @Override public void setServletContext(ServletContext servletContext) { System.out.println("setServletContext方法"); } }
注意:该方法会在填充完普通Bean的属性,但是还没有进行Bean的初始化之前执行
2.实现ServletContextListener接口
/** * 在初始化Web应用程序中的任何过滤器或servlet之前,将通知所有servletContextListener上下文初始化。 */ @Override public void contextInitialized(ServletContextEvent sce) { //ServletContext servletContext = sce.getServletContext(); System.out.println("执行contextInitialized方法"); }
3.将要执行的方法所在的类交个spring容器扫描(@Component),并且在要执行的方法上添加@PostConstruct注解或者静态代码块执行
@Component public class Test2 { //静态代码块会在依赖注入后自动执行,并优先执行 static{ System.out.println("---static--"); } /** * @Postcontruct’在依赖注入完成后自动调用 */ @PostConstruct public static void haha(){ System.out.println("@Postcontruct’在依赖注入完成后自动调用"); } }