在SpringBoot中采用了大量的Initializer和Listener,本文主要讲解Initializer的三种定义方式。
方式一:通过扫描配置文件application.yml进行注入
自定义初始化类MyInitializer,该类实现了接口ApplicationContextInitializer,同时在项目的配置文件中定义该类的全路径。当项目启动时,会扫描该配置文件完成类的初始化并进行调用。
public class MyInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
System.out.println("通过扫描配置文件application.yml进行注入");
}
}
在application.yml中添加配置
context:
initializer:
classes: com.lr.interfaces.initializer.MyInitializer
方式二:通过扫描spring.factories进行注入
自定义初始化类MyInitializer2,该类实现了接口ApplicationContextInitializer,在项目中新建 resources/META-INF/spring.factories,配置文件中添加如下配置:
org.springframework.context.ApplicationContextInitializer=\
com.lr.interfaces.initializer.MyInitializer2
当SpringBoot项目启动时,会自动扫描该文件完成类的初始化并进行调用。(ps:SpringBoot中的SPI机制)
public class MyInitializer2 implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
System.out.println("通过扫描spring.factories进行注入");
}
}
方式三:通过启动类进行注入
自定义初始化类MyInitializer3,该类实现了接口ApplicationContextInitializer,在启动时通过调用addInitializers完成类初始化和调用。
public class MyInitializer3 implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
System.out.println("通过启动类进行注入");
}
}
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class AppConfig {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(AppConfig.class);
springApplication.addInitializers(new MyInitializer3());
springApplication.run(args);
}
}
总结
三种初始化器在SpringBoot中调用顺序:
(1)方式一:通过扫描配置文件application.yml进行注入。
(2)方式二:通过扫描spring.factories进行注入
(3)方式三:通过启动类进行注入。