SpringApplication的初始化
我们都知道我们在创建一个boot项目的时候都会有个启动类如下:
@SpringBootApplication
public class Demo1Application {
public static void main(String[] args) {
SpringApplication.run(Demo1Application.class, args);
}
}
那我们首先看这个SpringApplication这是一个重要的部分,可以看到他调用了run方法,那么这个run方法我们待会再说,先说这个SpringApplication,他主要呢就是做了一些事情。这里做的事情呢也是为后文有用
- 主类赋值给primarySource
- 判断应用类型
- 从META-INF/spring.factories里面拿一些东西然后初始化和赋值最终装入到集合中
- 根据调用栈,拿到main方法的类名
那么我们就来看看源码是怎么实现的 主要的就是 getspringFactoriesInstance这个方法:
// 这里是推断应用类型
this.webApplicationType = WebApplicationType.deduceFromClasspath();
this.bootstrapRegistryInitializers = new ArrayList(this.getSpringFactoriesInstances(BootstrapRegistryInitializer.class));
// 从自动配置里面拿到类然后通过底层实例化成对象(Initializer)
this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
// 从自动配置里面拿到类然后通过底层实例化成对象,这里是监听器是spring的监听器
this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
//根据调用栈,拿到main方法的类名
this.mainApplicationClass = this.deduceM