SpringBoot启动流程
这是我参与8月更文挑战的第30天,活动详情查看:8月更文挑战;
先放两张图醒醒神~
ApplicationContextInitializer(初始化器)
官网的解答是:
用于ConfigurableApplicationContext通过调用refresh函数来初始化Spring容器之前的回调函数.
通常在web应用中,设计在初始化Spring容器之前调用。例如依赖于容器ConfigurableApplicationContext中的Enviroment来记录一些配置信息或者使一些配置文件生效.
参考ContextLoader和FrameworkServlet中支持定义contextInitializerClasses作为context-param或定义init-param.
支持Order注解,表示执行顺序,越小越早执行.
我的理解是在执行刷新前需要做的一些操作:例如加载某些配置文件,验证某些配置的存在与否等 都可以使用ApplicationContextInitializer进行
实现ApplicationContextInitializer的3种方式
第一种
(1)编一个类实现了ApplicationContextInitializer的类,在initialize方法中编写初始化时候执行的方法。
package spring.boot.notes.jacquesh.contextInitializer;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.annotation.Order;
@Order(1)
public class JacqueshApplicationContextInitializerOne implements ApplicationContextInitializer {
@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
System.out.println("初始化器配置:1");
}
}
(2)在resource/META-INF中创建一个spring.factories文件,并在spring.factories中设置ApplicationContextInitializer的实现类位置(使其初始化器能被SpringBoot能感知到,并且执行)
org.springframework.context.ApplicationContextInitializer=spring.boot.notes.jacquesh.contextInitializer.JacqueshApplicationContextInitializerOne
第二种
(1)编一个类实现ApplicationContextInitializer
@Order(2)
public class JacqueshApplicationContextInitializerTwo implements ApplicationContextInitializer {
@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
System.out.println("初始化配置方法执行:2");
}
}
(2)在SpringApplicationContext初始化的时候设置进去
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication springApplication =new SpringApplication(Application.class);
springApplication.addInitializers(new JacqueshApplicationContextInitializerTwo());
springApplication.run(args);
}
}
第三种
(1)编一个类实现ApplicationContextInitializer
@Order(3)
public class JacqueshApplicationContextInitializerThree implements ApplicationContextInitializer {
@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
System.out.println("初始化配置方法执行:3");
}
}
(2)创建resource/application.properties (resource/application.yaml)并在application.properties(resource/application.yaml)中设置ApplicationContextInitializer实现的类实现
context.initializer.classes=spring.boot.notes.jacquesh.contextInitializer.JacqueshApplicationContextInitializerThree
context:
initializer:
classes: spring.boot.notes.jacquesh.contextInitializer.JacqueshApplicationContextInitializerThree