Spring系列:Spring Bean加载过程以及生命周期

3 篇文章 0 订阅

流程图

在这里插入图片描述

Spring中的两大回调接口作用:

// 关于对象工厂BeanFactory创建完毕的回调处理
org.springframework.beans.factory.config.BeanFactoryPostProcessor
// 关于通过对象工厂BeanFactory创建对象前后的回调处理
org.springframework.beans.factory.config.BeanPostProcessor

BeanFactoryPostProcessor相关接口的注册 + 回调处理顺序

BeanFactoryPostProcessor还有一个子接口为org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor拓展了一个方法为
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
在对象工厂BeanFactory创建完毕而且正常的BeanDefinition都已经加载完毕而且尚未初始化时调用。
用来修改BeanDefinitionRegistry

顺序:
1.直接注册到AbstractApplicationContext中的beanFactoryPostProcessors且类型为BeanDefinitionRegistryPostProcessor 执行
BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)

2.被BeanFactory通过AbstractRefreshableApplicationContext创建BeanFactory时的loadBeanDefinition加载的(或者第一步修改registry注册进去的)类型为
BeanDefinitionRegistryPostProcessor的而且实现了PriorityOrdered接口的BeanDefinition。
然后根据getOrder()的值通过排序器((DefaultListableBeanFactory) beanFactory).getDependencyComparator()
如果不存在则用OrderComparator.INSTANCE。调用postProcessor.postProcessBeanDefinitionRegistry(registry);

3.被BeanFactory通过AbstractRefreshableApplicationContext创建BeanFactory时的loadBeanDefinition加载的(或者第一步、第二步修改registry注册进去的)类型为
    BeanDefinitionRegistryPostProcessor的而且实现了Ordered接口的BeanDefinition,然后根据getOrder()的值通过排序器
    ((DefaultListableBeanFactory) beanFactory).getDependencyComparator()如果不存在则用OrderComparator.INSTANCE。
    调用postProcessor.postProcessBeanDefinitionRegistry(registry);
    注意:PriorityOrdered是Ordered的子接口,因此这里就算第二部注册了一些实现了PriorityOrdered的BeanDefinitionRegistryPostProcessor,
    仅仅会根据getOrder()值进行排序执行的。
    
4.到这可能会由3步骤产生新的BeanDefinitionRegistryPostProcessor类型的BeanDefinition,而且每一次调用都可能会产生新的该类型BeanDefinition
    这里直接循环(+ 排序)调用postProcessor.postProcessBeanDefinitionRegistry(registry);,
    直至没有需要处理的BeanDefinitionRegistryPostProcessor类型的为止。
    
5.执行上面获取的所有BeanPostProcessor中的postProcessor.postProcessBeanFactory(beanFactory);
    虽然BeanDefinitionRegistryPostProcessor为BeanPostProcessor的子类,但是上面处理并没有开始执行postProcessor.postProcessBeanFactory(beanFactory);
    方法,这一步直接全部挨个先调用BeanDefinitionRegistryPostProcessor的postProcessBeanFactory(beanFactory)后调用
    上面从AbstractApplicationContext中获取的类型不为BeanDefinitionRegistryPostProcessor以及1234获取的类型为BeanPostProcessor的
    postProcessBeanFactory(beanFactory)回调。
    
6.在第四步循环处理的是为子类型BeanDefinitionRegistryPostProcessor,因此会产生很多新的BeanPostProcessor这里统一处理有类型为BeanFactoryPostProcessor的
   将所有类型为BeanPostProcessor的根据实现了1、ProrityOrdered接口的与实现2、Ordered接口的以及3、未实现排序接口的分为三组
   然后排序依次执行

3.BeanPostProcessor相关接口在BeanFacotry中注册的顺序

1.在执行registerBeanPostProcessors(beanFactory);之前直接注册到BeanFactory中的顺序不变
2.BeanPostProcessorChecker紧随此前直接注册到BeanFacotry中BeanPostProcessor
3.实现了PriorityOrdered接口的BeanPostProcessor (根据getOrder()排序)
4.实现了Ordered接口的BeanPostProcessor(根据getOrder()排序)
5.未实现关于Order接口的普通BeanPostProcessor
6.所有类型为BeanPostProcessor的子类型的MergedBeanDefinitionPostProcessor重新注册,使它们的执行顺序在BeanPostProcessor直接类型的后面
7.ApplicationListenerDetector这个BeanPostProcessor放到最最后面

推荐文章
Spring解密 - Bean 加载流程
Spring Bean的生命周期(非常详细)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值