微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

spring源码学习五invokeBeanFactoryPostProcessors执行流程

在整理spring的bean创建的整体流程的时候,流程图上有一个重要的内容就是beanfactoryPostProcessor,字面解释就是对beanfactory的增强处理,这个接口里唯一的一个抽象方法的传入参数也是我们的当前容器对象,但是绝大多数的beanfactoryPostProcessor处理的目标是我们的beanDeFinition。

方法的整体处理流程如下:

 

1、如何从外部传入beanfactoryPostProcessors呢?

  如图所示,外部传入的集合是上下文中的beanfactoryPostProcessors属性

  可以在调用invokebeanfactoryPostProcessors方法之前给该属性赋值

  执行结果:

 

 

2、在执行BeanDeFinitionRegistryPostProcessor的时候又为什么会重复从容器中获取ppName呢?

 

这是因为在执行invokeBeanDeFinitionRegistryPostProcessors的时候有可能会往容器中添加新的BeanDeFinitionRegistryPostProcessor,看如下实现:

  1)首先自定几个MyRegistryPostProcessors实现BeanDeFinitionRegistryPostProcessor接口,在postProcessBeanDeFinitionRegistry方法注册其他的MyRegistryPostProcessors;

  2)在xml配置文件中配置第一个MyRegistryPostProcessors

     

 

执行结果:

第一次获取postProcessorNames,只有在配置文件中配置的MyRegistryPostProcessors

 

 第二次获取postProcessorNames,多了一个我们在MyRegistryPostProcessors中注册的myRegistryPostProcessors1

 

这也是为什么在执行BeanDeFinitionRegistryPostProcessor的时候需要重复在上下文容器中获取ppName的原因。

3、在执行父接口的方法postProcessbeanfactory又为什么没有重复获取呢?

  因为在postProcessbeanfactory方法中传入的参数是容器对象,无法添加新的beanDeFinition

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐