SpringBoot启动后如何自动执行初始化方法
Spring Boot启动后有三种回调方式,即实现ApplicationContextInitializer、ApplicationRunner或CommandLineRunner接口。
一、实现ApplicationContextInitializer接口
1、方法1:调用SpringApplication的addInitializers方法注册
1)自定义初始化类,实现ApplicationContextInitializer接口
public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { @Override public void initialize(ConfigurableApplicationContext applicationContext) { System.out.println("当前容器bean数量:"+applicationContext.getBeanDefinitionCount()); } }
2)容器启动时调用SpringApplication的addInitializers方法
public static void main(String[] args) { SpringApplication app=new SpringApplication(App.class); app.addInitializers(new MyApplicationContextInitializer()); ConfigurableApplicationContext context= app.run(args); context.close(); }
说明:若有多个初始化类,在main方法中add多次即可,启动后执行顺次与add顺序一致,也可以使用@Order(n)注解改变执行顺序
2、方法2:配置文件中设置属性注册
1)自定义初始化类,实现ApplicationContextInitializer接口(同上)
2)application.properties中配置context.initializer.classes属性
context.initializer.classes=com.leiyuke.temp.init.MyApplicationContextInitializer,\
com.leiyuke.temp.init.MyApplicationContextInitializer2
说明:若定义多个初始化类,在配置文件中设置多个即可,启动后执行顺次与配置顺序一致,也可以使用@Order(n)注解改变执行顺序
3、方法3:使用spring.factories机制
1)自定义初始化类,实现ApplicationContextInitializer接口(同上)
2)新建resources/META-INF/spring.factories文件
org.springframework.context.ApplicationContextInitializer=com.leiyuke.temp.init.MyApplicationContextInitializer2,\
com.leiyuke.temp.init.MyApplicationContextInitializer
说明:
1)若定义多个初始化类,在配置文件中设置多个即可,启动后执行顺次与配置顺序一致,也可以使用@Order(n)注解改变执行顺序
2)spring.factories机制扫描所有工程中的/META-INF/spring.factories文件,所以引入相关工程的依赖后,也可执行其初始化方法
二、实现ApplicationRunner接口
@Component public class ServerSuccessReport implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { System.out.println("ServerSuccessReport2:"+Arrays.asList(args.getSourceArgs())); } }
public static void main(String[] args) { SpringApplication app=new SpringApplication(App.class); ConfigurableApplicationContext context= app.run("aa","bb "); context.close(); }
三、实现CommandLineRunner接口
@Component public class ServerSuccessReport implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("ServerSuccessReport1:"+ Arrays.asList(args)); } }
public static void main(String[] args) { SpringApplication app=new SpringApplication(App.class); ConfigurableApplicationContext context= app.run("aa","bb "); context.close(); }
执行二、三输出:

说明:
1)默认执行顺序ApplicationContextInitializer、ApplicationRunner、CommandLineRunner
2)ApplicationRunner与CommandLineRunner可通过@Order改变顺序使CommandLineRunner早于ApplicationRunner执行
3)两个Runner的区别:CommandLineRunner参数是原始的,ApplicationRunner是对原始参数的封装
浙公网安备 33010602011771号