概述
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");
userBeanDef.getPropertyValues().add("username", "cxw");
// 快速初始化Bean
User user = (User)bea