1、spring boot 启动入口main方法 【spring|Spring Boot 启动流程】
文章图片
2、进入run()
文章图片
进入run()方法后看到new SpringApplication对象,点击进入SpringApplication的构造方法中
3、进入SpringApplication构造方法
文章图片
- 容器初始化
this.webApplicationType = WebApplicationType.deduceFromClasspath(); 进入该方法该静态体中通过ClassUtils.isPresent()方法通过fromName来判断常量中的类是否加载过,并根据加载的类来判断返回的容器类型。 webApplicationType对应的容器类型有三种如下: NONE :应用程序不作为web程序启动,不启动任何内嵌服务 SERVLET:应用程序以基于servlet的web应用启动,需要启动内嵌的servlet web服务 REACTIVE:应用程序以响应式web应用启动,需要启动内嵌的响应式的web服务
- 初始化spring.factories类
setInitializers((Collection)getSpringFactoriesInstances(ApplicationContextInitializer.class)); setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
4.进入run()方法的实现
public ConfigurableApplicationContext run(String... args) {
// 1、设置计时器
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
Collection exceptionReporters = new ArrayList<>();
//2、配置环境变量awt
configureHeadlessProperty();
// 3、获取SpringApplicationRunListeners 监听器并执行
SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting();
try {
// 4、将args封装成ApplicationArguments 对象
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
// 5、准备上下文环境
ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
// 6、过滤掉不需要的bean
configureIgnoreBeanInfo(environment);
// 7、打印环境信息
Banner printedBanner = printBanner(environment);
// 8、创建上下文 判断webApplicationType
context = createApplicationContext();
// 9、获取异常监听
exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,
new Class[] { ConfigurableApplicationContext.class }, context);
// 10、准备上线文
prepareContext(context, environment, listeners, applicationArguments, printedBanner);
//
refreshContext(context);
afterRefresh(context, applicationArguments);
stopWatch.stop();
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
}
listeners.started(context);
callRunners(context, applicationArguments);
}
catch (Throwable ex) {
handleRunFailure(context, ex, exceptionReporters, listeners);
throw new IllegalStateException(ex);
}try {
listeners.running(context);
}
catch (Throwable ex) {
handleRunFailure(context, ex, exceptionReporters, null);
throw new IllegalStateException(ex);
}
return context;
}
推荐阅读
- SpringBoot篇|Spring Boot启动过程
- Spring|spring boot启动流程
- Spring|Spring Boot的启动流程
- spring小结---AOP源码分析
- 多线程与高并发|4.如何终止线程
- Java基础|spring/spring boot 自定义日志注解输出请求参数和结果
- #|15-Spring架构源码分析-Spring代理与AOP
- #|16-Spring AOP源码分析-@EnableAspectJAutoProxy和AspectJAutoProxyRegistrar
- 微软|突发!马斯克 440 亿拿下Twitter!