Spring容器初始化全过程
spring容器主要有三种初始化⽅式,xml;注解;JavaConfig+注解形式,这⾥以⽬前最前卫的JavaConfig初始化⽅式来解读整个容器的初始化。(毕竟spring官⽅都强烈建议这种初始化⽅式,但可悲的是,国内的⼤部分中⼩企业还是使⽤传统的)
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
这是spring的⼊⼝类,spring容器的所有初始化操作都由此开始。
⼀、⾸先调⽤⽗类GenericApplicationContext的⽆参构造⽅法,实例化DefaultListableBeanFactory,这是spring的核⼼bean⼯⼚,所有BeanDefinition会存放在这⾥,所有后置处理器也会在这⾥,在实现BeanFactory接⼝的同时也实现了BeanDefinitionRegistry接⼝,因此它就承担了Bean的注册管理⼯作。BeanDefinitionRegistry的相关接⼝负责注册⼯作,BeanFactory的相关接⼝负责bean的管理⼯作。
⼆、调⽤⾃⾝的⽆参构造⽅法,主要实例化了两个功能性对象AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner,其中最主要的是往beanDefinitionMap中put了spring⾃⼰的6个BeanDefinition,各⾃有各⾃的功能。注意这⾥并不是真正的
Bean,BeanDefinition和后⾯Bean的⽣成有很重要的关系
ConfigurationClassPostProcessor
spring中最最重要的⼀个类,实现了BeanDefinitionRegistryPostProcessor接⼝,能扫描到所有的bean(通过@ComponentScan;
@Bean;@Import;等注⼊的bean),并注册为bd
AutowiredAnnotationBeanPostProcessor
spring中为bean进⾏属性注⼊的后置处理器,包括解决循环依赖的问题
RequiredAnnotationBeanPostProcessor
处理@Required注解相关的后置处理器
CommonAnnotationBeanPostProcessor
通⽤注解的后置处理器,@Resource属性的注⼊也是在这当中
EventListenerMethodProcessor
不清楚
DefaultEventListenerFactory
不清楚
三、register(annotatedClasses) 注册初始传⼊的配置类为bd。
四、refresh() spring容器初始化最核⼼的部分,这⾥处理了其90%的初始化⼯作。
prepareRefresh()
准备⼯作包括设置启动时间,是否激活标识位,初始化属性源(property source)配置
prepareBeanFactory(beanFactory)
准备bean⼯⼚,这⾥就包括了ApplicationContextAwareProcessor(处理各种实现了*Aware 接⼝的bean)这个BeanPostProcessor的add
postProcessBeanFactory(beanFactory)
属于spring的预留接⼝,在后⾯的版本中扩展
invokeBeanFactoryPostProcessors(beanFactory)
spring核⼼⽅法,处理执⾏⾃定义的和spring内部定义的 BeanDefinitionRegistryPostProcessor和
BeanFactoryPostProcessors,spring中那个最最重要的⼀个 类ConfigurationClassPostProcessor就是在这处理的,这⾥针对不同的来源,遵循以下执⾏顺序
1.⾃定义(⼿动add进来的)BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry⽅法
2.spring容器中实现了PriorityOrdered接⼝的BeanDefinitionRegistryPostProcessor的
postProcessBeanDefinitionRegistry                ⽅法
3.spring容器中实现了Ordered接⼝的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry⽅法
4.spring容器中其他(实现了PriorityOrdered和Ordered之外的)BeanDefinitionRegistryPostProcessor的                                        postProcessBeanDefinitionRegistry⽅法
5.所有(包括⾃定义的和由spring管理的)BeanDefinitionRegistryPostProcessor的⽗类BeanFactoryPostProcessor的                  postProcessBeanFactory⽅法
6.所有⾃定义的BeanFactoryPostProcessor的postProcessBeanFactory⽅法
7.所有spring管理的BeanFactoryPostProcessor(实现了PriorityOrdered接⼝)的postProcessBeanFactory⽅法
8.所有spring管理的BeanFactoryPostProcessor(实现了Ordered接⼝)的postProcessBeanFactory⽅法
9.所有spring管理的BeanFactoryPostProcessor(实现了PriorityOrdered和Ordered之外的)的postProcessBeanFactory                ⽅法spring aop应用场景
registerBeanPostProcessors(beanFactory)
添加BeanPostProcessor到DefaultListableBeanFactory中的名为beanPostProcessors的List中,所以spring的所有后置处理器都是放在⼀个List中的
initMessageSource()
初始化国际化信息
initApplicationEventMulticaster()
初始化应⽤事件⼴播器
onRefresh()
属于spring的预留接⼝,在后⾯的版本中扩展
registerListeners()
spring event 注册事件
finishBeanFactoryInitialization(beanFactory)
spring核⼼⽅法 实例化bean,bean的整个⽣命周期也从这⾥开始
1) 实例化之前⾸先去单例池中获取:getBean ---doGetBean---getSingleton,如果获取不到从singletonObjects中获取(解决bean的循环依赖问题)
2) 如果上⼀步没有获取到bean,就会进⼊bean的创建流程,执⾏第⼀次后置处理器
InstantiationAwareBeanPostProcessor#applyBeanPostProcessorsBeforeInstantiation
⽅法如果有返回值,将代替原本该⽣成的⽬标对象的实例,后续将只会调⽤所有
BeanPostProcessor#postProcessAfterInitialization⽅法,下⾯的初始化操作将不再执⾏,这个后置处理器的经典应⽤场景是spring aop的代理增强剔除不必要增强的类
3) 执⾏第⼆次后置处理器SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors推断构造⽅法,如果有特殊的构造⽅法(@Autowired/@Value修饰)或者是标识⾸选的构造⽅法,则使⽤特殊的构造⽅法进⾏初始化,如果只有⼀个默认的构造⽅法,则返回null,就会再接下来使⽤默认的⽆参构造⽅法进⾏初始化,其实现类是AutowiredAnnotationBeanPostProcessor
4) 经过上⼀步之后,⽬标对象已经被new出来了,只是这个时侯还是对象,并不是⼀个bean,执⾏第三次后置处理
器,MergedBeanDefinitionPostProcessor # postProcessMergedBeanDefinition 缓存bean实例化时须要通过注解注⼊的对象信息
5) addSingletonFactory,执⾏第四次后置处理
器,SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference(其实不是第四次,因为是通过lambd表达式注⼊的,后续要⽤的时候才会⽤),将对象提前暴露出来,主要是为了解决spring循环依赖的问题
6) populateBean,对bean的属性赋值,这⾥会执⾏第五次后置处理
器,InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation,确定是否须要注⼊属性,实现这个接⼝,返回的bean 就不做后续的初始化操作了
7) 执⾏第六次后置处理器,InstantiationAwareBeanPostProcessor#postProcessPropertyValues,这⾥将完成属性注⼊,其中处理@AutoWired注解也是在这⾥来处理的
8) initializeBean,执⾏到这⼀步,对象已经完成了属性装配,可以称作为⼀个bean了,这⾥会相继执⾏第七次后置处理器BeanPostProcessor # postProcessBeforeInitialization;执⾏InitializingBean的实现;执⾏第⼋次后置处理器BeanPostProcessor # postProcessAfterInitialization,完成对bean的最后实例化阶段,最终实例化完成的单例bean将放在DefaultSingletonBeanRegistry 中的⼀个Map中(singletonObjects)
finishRefresh()
⾄此结束整个容器的初始化过程

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。