聊聊Spring中的BeanFactoryPostProcessor以及其子类

 BeanFactoryPostProcessor顾名思义bean工厂的后置处理器,它主要是对bean工厂做一些操作,他可以利用其中的postProcessBeanFactory方法对beanfactory做一些操作,同时他有一个比较厉害的实现类BeanDefinitionRegistryPostProcessor,这个抽象类继承了BeanfactoryPostProcessor,同时多定义了一个方法postProcessBeanDefinitionRegistry在这个方法中可以对BeanDefinaition做一些BeanDefination做一些增加修改操作。总之BeanFactoryPostProcess和其实现类都是对BeanFactory或者工厂中的BeanDefination做了一些操作,这些操作必须在bean实例化之前执行完成,因为在之后就没有任何意义了。
 在spring的源码中执行BeanFactory的方法是在org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors如图:
在这里插入图片描述
在这个方法中又调用了PostProcessorRegistrationDelegate的一个静态方法invokeBeanFactoryPostProcessors如图:
在这里插入图片描述
同时在调用的时候使用了 this.getBeanFactoryPostProcessors()作为传入参数,而这个方法其中是返回了一个beanFactoryPostProcessors的值,这个变量是个list,它其中包含了所有的BeanFactoryPostProcessor的这个BeanFactory的list有些特殊,只有在调用addBeanFactoryPostProcessor才会往其中添加数据,而在所有的spring的类中并未调用过这个方法,所以这个方法是交个用户自己来调用的,当用户写了一个自定义的BeanFactoryPostProcessor的时候可以调用applicationContext.addBeanFactoryPostProcessor来添加一个BeanFactoryPostProcessor这时候这个list才会有数据,上边的方法才会传入处理器,这就是我们说的这个方法第一次的执行会执行用户自定义的BeanFactoryPostProcessor。在org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors(…)这个方法中首先去调用了所有实现了BeanDefinitionRegistryPostProcessor这个接口的postProcessBeanDefinitionRegistry,然后调用了postProcessBeanFactory这个方法,在这里随着方法的调用有个特别重要的类的方法会在此处调用那就是ConfigurationClassPostProcessor这个类在spring中起着非常重要的作用,它的主要功能是参与BeanFactory的建造,在这个类中,会解析加了@Configuration的配置类,还会解析@ComponentScan、@ComponentScans注解扫描的包,以及解析@Import等注解。那么这个类是什么时候被添加到容器中的呢?他是在实例化读取器的时候被添加的,就是在AnnotatedBeanDefinitionReader的构造方法中将ConfigurationClassPostProcessor添加到容器中如图:
在这里插入图片描述
并且在这个方法中他会先安排这个后置处理器执行,这个就可以先进行加载扫描的工作了。
 在调用完了实现了BeanDefinitionRegistryPostProcessor接口的后置处理器的方法以后又调用了实现了BeanFactoryPostProcessor的所有postProcessBeanFactory方法这样至此BeanFactoryPostProcessor的所有方法就执行完毕了,容器中所有的实现了BeanFactoryPostProcessor的类也被调用过了。当然其中又很多调用细节,比如说:先调用实现了PreOrder的后置处理器然后调用实现了Order接口的后置处理器等等,这里就不再一一描述,大家有兴趣可以去看源码,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值