PostProcessor
为什么要有这个后置处理器这种接口,了解Spring容器的朋友应该知道,所有的ApplicationContext
都需要调用AbstractApplicationContext#refresh
方法,这是一个模板方法,既然使用了模板方法设计模式,那么就应该提供hook
,也就是钩子函数。而PostProcessor
就是为了实现这种定制化的扩展需求而制定的。
UML
- BeanPostProcessor
- BeanFactoryPostProcessor
PostProcessor概览
BeanFactoryPostProcessor
容器级别的后置处理器,其内部仅声明了一个方法。Spring会根据声明的顺序对后置处理器进行调用,而BeanFactoryPostProcessor会在容器初始化期间将容器本身交由接口实现类去处理。获取到了容器,就可以做很多定制化的操作了。
1 | java复制代码@FunctionalInterface |
BeanDefinitionRegistryPostProcessor
从注解容器解析BeanDefinition的篇章中,你会了解到
BeanDefinitionRegistryPostProcessor
是一种特殊的BeanFactoryPostProcessor,但是Spring会优先处理这类后置处理器,再处理常规的一些BeanFactoryPostProcessor.可以理解成VIP级别的BeanFactoryPostProcessor,优先于常规BeanFactoryPostProcessor执行。其内部也声明了一个专用的注册后置处理方法。postProcessBeanDefinitionRegistry
1 | java复制代码public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor { |
BeanPostProcessor
容器创建Bean时的hook实例,你可以通过实现BeanPostProcessor来影响所有Bean的生命周期,包括
Initialization
的前置与后置处理.在后面学习Spring Bean的生命周期中,会接触BeanPostProcessor
1 | java复制代码public interface BeanPostProcessor { |
使用postProcessor
MyBeanFactoryPostProcessor
- 基础对象
1 | java复制代码@Data |
- 通过后置处理器往容器注入BeanDefinition
1 | java复制代码package com.xjm.bean.postprocessor; |
- test
@ComponentScan根据自己的包路径进行修改,此处程序正常运行,说明Root已经注册到容器中了.
1 | java复制代码@Configuration |
MyBeanPostProcessor
简单实现BeanPostProcessor,主要是观察其行为的作用域.
1 | java复制代码@Configuration |
- result
可以看到,实现的MyBeanPostProcessor影响了所有Bean的初始化过程.
总结
- 后置处理器是Spring留给开发者的扩展性钩子接口。
- 从后置处理器上可以简略分为:
BeanFactoryPostProcessor
和BeanPostProcessor
.其中,BeanFactoryPostProcessor
可以操作容器,BeanPostProcessor
会影响所有Bean的生命周期. BeanDefinitionRegistryPostProcessor
是一种特殊的BeanFactoryPostProcessor
,优于其他BeanFactoryPostProcessor
执行.
扩展阅读
Spring系列六:Spring BeanPostProcessor
本文转载自: 掘金