0、demo
先写个测试程序
@SpringBootApplication
public class SpringBootSourceStuApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootSourceStuApplication.class,args);
}
}
1、图解核心流程
2、实例化SpringApplication源码解析
在SpringApplication的构造方法中调用initialize方法进行初始化的工作,看看代码注释了解其具体做了哪些事情。
源码:initialize
// **************** org.springframework.boot.SpringApplication ******************/
public static ConfigurableApplicationContext run(Object source, String... args) {
return run(new Object[] { source }, args);
}
public static ConfigurableApplicationContext run(Object[] sources, String[] args) {
return new SpringApplication(sources).run(args);
}
public SpringApplication(Object... sources) {
initialize(sources);
}
// sources的值:{SpringBootSourceStuApplication.class}
private void initialize(Object[] sources) {
if (sources != null && sources.length > 0) {
this.sources.addAll(Arrays.asList(sources));
}
//
this.webEnvironment = deduceWebEnvironment();
setInitializers((Collection) getSpringFactoriesInstances(
ApplicationContextInitializer.class));
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
this.mainApplicationClass = deduceMainApplicationClass();
}
1.1、推断和设置“是否为 Web 环境”
1.2、获取、创建ApplicationContextInitializer
1.3、获取、创建ApplicationListener
1.4、设置 SpringApplication 主启动类
A、问题:
为什么两次调用SpringApplication.run方法?下面是两次调用run方法的调用栈:
run:296, SpringApplication (o.s.boot) [2]
run:134, SpringApplicationBuilder (o.s.boot.builder)
bootstrapServiceContext:187, BootstrapApplicationListener (o.s.cloud.bootstrap)
onApplicationEvent:102, BootstrapApplicationListener (o.s.cloud.bootstrap)
onApplicationEvent:68, BootstrapApplicationListener (o.s.cloud.bootstrap)
doInvokeListener:172, SimpleApplicationEventMulticaster (o.s.context.event)
invokeListener:165, SimpleApplicationEventMulticaster (o.s.context.event)
multicastEvent:139, SimpleApplicationEventMulticaster (o.s.context.event)
multicastEvent:122, SimpleApplicationEventMulticaster (o.s.context.event)
environmentPrepared:74, EventPublishingRunListener (o.s.boot.context.event)
environmentPrepared:54, SpringApplicationRunListeners (o.s.boot)
prepareEnvironment:325, SpringApplication (o.s.boot)
run:296, SpringApplication (o.s.boot) [1]
run:1118, SpringApplication (o.s.boot)
run:1107, SpringApplication (o.s.boot)
main:21, AppBMain (com.yh.stu)