- SpringApplication构造方法
在启动SpringBoot项目时,我们经常会遇到下图1.1这样的代码。
SpringApplication.run内部调用了SpringApplication的构造方法,所以要分析SpringBoot的启动流程首先就要分析该构造方法。
SpringApplication构造方法主要做了以下五件事情:
(1)获取Bean Definition
(2)推断应用类型,通过jar包推断应用类型,从而创建不同的ApplicationContext,例如pom文件有sprinbg-boot-starter-web依赖,就很可能被推断为web应用。
(3)添加ApplicationContext初始化器,对ApplicationContext功能进行拓展
(4)添加监听器与事件,监听SpringBoot启动过程中的事件
(5)主类推断,推断main方法所在内
1.1 获取Bean Definition
打印构造方法执行后获取到的Bean Definition
SpringApplication spring = new SpringApplication(A39_1.class);
ConfigurableApplicationContext context = spring.run(args);
for (String name : context.getBeanDefinitionNames()) {
System.out.println("name: " + name + " 来源:" + context.getBeanFactory().getBeanDefinition(name).getResourceDescription());
}
1.2 推断类型
this.webApplicationType = WebApplicationType.deduceFromClasspath();
当前应用中包含spring-boot-starter-web依赖,该依赖存在DispatcherHandler和Servlet,最终被SpringBoot推断为web应用。
1.3 扩展
给SpringApplication添加初始化器,初始化器添加Bean对象到容器中。
spring.addInitializers(applicationContext -> {
if (applicationContext instanceof GenericApplicationContext gac) {
gac.registerBean("bean3", Bean3.class);
}
});
1.4 监听器
spring.addListeners(event -> System.out.println("\t事件为:" + event.getClass()));