springboot启动之run方法
2022-11-01 10:22:25 13 举报
AI智能生成
springboot启动之run方法
作者其他创作
大纲/内容
1 获取并启动监听器
SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting();
listeners.starting();
getRunListeners()->存在一个getSpringFactoriesInstances() :通过指定的classloader 从META-INF/spring.factories获取指定的Spring的工厂实例
最终获得监听器为:EventPublishingRunListener ,此监听器是Spring容器的启动监听器
2构造应用上下文环境
ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
上下文环境包括:计算机的环境,Java环境,Spring的运行环境,Spring项目的配
置(在SpringBoot中就是那个熟悉的application.properties/yml)等等
置(在SpringBoot中就是那个熟悉的application.properties/yml)等等
初始化应用上下文
// ConfigurableApplicationContext Spring 的上下文
ConfigurableApplicationContext context = null;
context = createApplicationContext();
ConfigurableApplicationContext context = null;
context = createApplicationContext();
声明的context 就是我们熟悉的上下文(容器) context 包含了 beanFactory的ioc容器
4刷新应用上下文前的准备工作
prepareContext(context, environment, listeners, applicationArguments, printedBanner);
这里简单描述就是: 判断启动类上是否标注@componse注解,存在后将此类封装成AnnotatedGenericBeanDifinition ,最后将这个歌beanDifinition注册到 beanDifinitionMap中
5刷新应用上下文(最重要的方法)
refreshContext(context);
跳转:从refreshContext()[springboot]-> refresh()[spring]->InvokeBeanFactoryPostProcessors(beanFactory)[refresh方法中的方法]
此时 springboot的工作已经完成,将ioc容器初始化bean交给了spring完成
此时 springboot的工作已经完成,将ioc容器初始化bean交给了spring完成
ioc容器初始化包括三个步骤:
1Resource定位
2BeanDifinition的载入
3注册BeanDifinition
1Resource定位
2BeanDifinition的载入
3注册BeanDifinition
Resource: 主要注册的bean定位在,1主类所在的包下,2SPI扩展机制实现的自动装配,3 @Import注解指定的类
BeanDifinition载入:定位后得到basePackage ,springboot将其路径拼接为:(classpath:com/xxx/**/.class)形式,根据这个路径去将文件加载进来,然后判断是否为@component 注解标注,如果是则装载成BeanDifinition
BeanDifinition注册:最终会将这些BeanDifinition注册到ConcurrentHashmap中(比如 DefaultLIstableBeanFactory中的 BeanDifinitionMap属性)
6刷新应用上下文的扩展接口
afterRefresh(context, applicationArguments);
扩展接口,设计模式中的模板方法,默认为空实现。如果有自定义需求,可以重写该方法。比如打
印一些启动结束log,或者一些其它后置处理。
印一些启动结束log,或者一些其它后置处理。
收藏
收藏
0 条评论
下一页