概述
BeanFactoryPostProcessor
是Spring中一个相当重要的扩展点,扩展点就是能让我们在Spring容器以及Bean生命周期的各个阶段中可以进行修改扩展。
什么是BeanFactoryPostProcessor
BeanFactoryPostProcessor
, 翻译过来大致是Bean的工厂处理器,顾名思义,可以理解为它对Bean工厂中Bean定义( BeanDefintion
)进行修改, 它的执行时机:BeanFactory标准初始化之后,所有的Bean定义已经被加载,但标准Bean的实例还没被创建(不包括 BeanFactoryPostProcessor
类型)。该方法通常用于修改bean的定义,Bean的属性值等,甚至可以在此快速初始化Bean。
而另外一个相关的扩展接口的 BeanDefinitionRegistryPostProcessor
,继承自 BeanFactoryPostProcessor
,所有的Bean定义即将被加载,但Bean的实例还没被创建时,也就是说, BeanDefinitionRegistryPostProcessor
的 postProcessBeanDefinitionRegistry
方法执行时机先于 BeanFactoryPostProcessor
的 postProcessBeanFactory
方法。
区别于一个很类似的扩展接口 BeanPostProcessor
, 它的执行时机实在Bean初始化前后,添加一些自己想要的逻辑。
小结一下,上面关联的扩展接口执行顺序如下:1. BeanDefinitionRegistryPostProcessor
,2. BeanFactoryPostProcessor
,3. BeanPostProcessor
。而 BeanFactoryPostProcessor
主要是在标准的 BeanDefinition
已经准备完毕,可以去修改已有的 BeanDefinition
的相关属性等。
如何使用BeanFactoryPostProcessor
- 新建一个测试bean
@Data @Component public class Student { @Value("${user.username:alvin}") private String username; @Value("${user.age:12}") private int age; } 复制代码
- 新建处理器实现
BeanFactoryPostProcessor
@Component @Slf4j public class TestBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { log.info("******************** TestBeanFactoryPostProcessor#postProcessBeanFactory ****************"); log.info("******************** bean的数量:[{}] ****************", beanFactory.getBeanDefinitionCount()); // 修改bean definition属性信息 BeanDefinition userBeanDef = beanFactory.getBeanDefinition("student");