BeanDefinitionRegistryPostProcessor 主要工作是什么,为什么要在BeanFactoryPostProcessor前面进行加载,并举例说明。
时间: 2024-02-07 07:42:19 浏览: 114
com-spring-ioc-demo:源码主要是学习Spring IOC的原理,以及对Bean的注册及控制,主要运用以下类对Spring进行扩展学习:BeanPostProcessor,BeanFactoryAware,BeanNameAware,ApplicationContextAware,FactoryBean,BeanDefinitionRegistryPostProcessor,BeanFactoryPostProcessor,BeanPostProcessor,ResourceLoaderA
BeanDefinitionRegistryPostProcessor是一个特殊的BeanFactoryPostProcessor,它在BeanFactoryPostProcessor前面被加载,用于修改或添加BeanDefinition,从而对BeanFactory中的Bean进行定制化配置。
其主要工作包括:
1. 注册或修改BeanDefinition:通过实现postProcessBeanDefinitionRegistry方法,可以在BeanDefinition加载前修改或添加BeanDefinition,从而实现对Bean的定制化配置。
2. 获取或修改BeanDefinition:通过实现postProcessBeanFactory方法,可以获取到已经注册的所有BeanDefinition,并对其进行修改或添加。
由于BeanDefinitionRegistryPostProcessor是在BeanFactoryPostProcessor前面执行的,所以它可以在BeanFactory实例化之前对BeanDefinition进行修改,而BeanFactoryPostProcessor只能在BeanFactory实例化之后对已有的Bean进行后置处理。
举个例子,比如在Spring Boot中,我们可以使用@ConfigurationProperties注解来将配置文件中的属性值绑定到Bean上。但是如果我们想要动态的添加一些属性,就需要使用BeanDefinitionRegistryPostProcessor来实现。比如:
```java
@Configuration
public class MyPropertiesConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
@Bean
public MyProperties myProperties() {
return new MyProperties();
}
@Bean
public static BeanDefinitionRegistryPostProcessor beanDefinitionRegistryPostProcessor() {
return new BeanDefinitionRegistryPostProcessor() {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(MyProperties.class)
.addPropertyValue("newProperty", "newPropertyValue")
.getBeanDefinition();
registry.registerBeanDefinition("myProperties", beanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
};
}
}
```
上面的例子中,我们通过BeanDefinitionRegistryPostProcessor动态的添加了一个名为newProperty的属性,并将其值设置为newPropertyValue。这样在MyProperties中就可以通过@ConfigurationProperties注解来使用这个属性了。
阅读全文