容器刷新完整流程图
2021-04-13 11:02:40 0 举报
spring容器刷新十二大步流程图
作者其他创作
大纲/内容
关闭工厂状态
ConfigurationClassPostProcessor解析配置类的后置处理器在此工作《重要》所有功能的配置和开启都在配置类
postProcessBeanFactory()后置处理bean工厂
怎么让主配置类里面的配置生效
解析@Lazy、@Primary、@DependsOn、@Description
finishBeanFactoryInitalization完成工厂初始化
把主配置注册进去
执行所有后初始化操作SmartInitialingSingleton.afterSingetonsInstantiated
singObject里面东西不多,bdm里面 全了
initApplicationEventMulticaster初始化事件多播器组件
finishRefresh();最后一些清理、事件发送等
准备环境变量等一些信息
new AnnotationConfigApplicationContext(MainConfig.class);Spring的容器创建逻辑。
给工厂里面设置了好必要的工具比如:el表达式解析器、资源解析器、基本的后置处理器如(ApplicationContextAwareProcessor判断是否当前组件是否实现了xxxAware接口)
LifecycleProcessor
initPropertySources:初始化属性Environment():准备环境变量
内部
invokeBeanFactoryPostProcessors执行工厂的后置增强所有的BeanDefinition就已经准备就绪
返回了在this()环节早就new好的工厂
scanner扫描需要导入的所有bean信息ClassPathBeanDefinitionScanner
AbstractBeanDefinition,给他构造器打端点来检测所有组件以及Spring的L流程
reader读取beanDefinitionAnnotatedBeanDefinitionReader后续就是为了加载底层功能组件的后置处理器
容器刷新完整流程图
1.看容器中是否有MessageSource的定义信息2.如果没有就注册一个默认的3.把国际化组件(MessageSource)放到单例池中
子流程
this
目前还没初始化
register(mainConfig)注册
所有Bean的定义信息全部准备完备(利用反射把BeanClass的元数据都准备好了,并且放在了BeanDefinitionMap中,方便以后查找)
prepareBeanFactory(beanFactory);预准备工厂
obtainFreshBeanFactory获取当前准备好的空容器
registerAnnotationConfigProcessors注册一个注解配置的而处理器
拿到主配置类的BeanDefinition的信息(创建出的)
所有BeanPostProcessor开始工作进行单个组件的功能增强
spring.internalConfiguration==>AnnotationProcessorConfigurationClassPostProcessor(BeanFactoryPostProcessor)【处理配置类】internalAutowiredAnnotationProcessor==>AutowiredAnnotationBeanPostProcessor(SmartInstantiationAwareBeanPostProcessor)【自动装配功能】internalCommonAnnotationProcessor==>CommonAnnotationBeanPostProcessor(InstantiationAwareBeanPostProcessor)【普通JSR250注解处理,支持@PostConsutruct、@PreDestroy、@Resource注解】internalPersistenceAnnotationProcessor==>PersistenceAnnotationBeanPostProcessor【jpa功能支持】internalEventListenerProcessor==>EventListenerMethodProcessor【事件功能(事件方法)的后置处理器】internalEventListenerFactory==>DefaultListableBeanFactory【事件工厂】
reader来注册所有的主配置类
prepareRefresh();准备上下文环境
registerBeanPostProcessors注册Bean的后置处理器详细参照《Bean生命周期图》
refresh();十二大步
initMessageSource()初始化国际化组件
给工厂准备些基础组件(各种解析器)
1.获取容器中定义的所有ApplicationListener2.把这些ApplicationLIstener保存起来
processCommonDefinitionAnnotations完善主配置类的定义信息
1.拿到工厂中的所有Bean定义信息(后置处理器(第一步的那几个)+配置类)2.找到真正的配置类3.使用parse进行配置类解析4.扫描所有组件进来4.1scanner扫描包路径下的所有类,判断是否扫描范围内的,如果是就封装成ScannerGenericBeanDefinition添加需要返回的组件集合中(@Lazy等注解会在这一步解析,保存到当前Bean的定义信息【BeanDefinition】中)5除了会处理@componentScan注解还能处理【@PropertySource @import @importResource】
ApplicationListenerDetector(beanPostProcessor)虽然前面注册过,但是为了调整个顺序
PostProcessorRegistrationDelegate管理所有后置处理器的执行BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessorBeanPostProcessor
给工厂注册核心组件
给容器中放的后置处理器ApplicationListenerDetector)(BeanPostProcessor)ApplicationContextAwareProcessor(BeanPostProcess)所有的PostProcessor都不会放在单例池,放在了beanPostProcessor池里面
onRefresh();留给子类继续增强处理逻辑
解析配置类之前,工厂很简单,只有前面步骤注册的简单组件和第一步注册的一些Bean定义信息
registerListeners();注册监听器
0 条评论
下一页