上節(jié)我們學習了Spring 的其中一個拓展BeanFactoryPostProcessor和相關源碼的簡單的解讀過程,本節(jié)我們 來學習另外一個拓展功能BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor
不難發(fā)現,BeanDefinitionRegistryPostProcessor是繼承BeanFactoryPostProcessor
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
那它的作用很明顯了,這里就不在啰嗦,接著我們來看下它的簡單使用過程:
簡單使用
-1.編寫MyBeanDefinitionRegistryPostProcessor類實現BeanDefinitionRegistryPostProcessor接口
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
int count = beanDefinitionRegistry.getBeanDefinitionCount();
System.out.println("MyBeanDefinitionRegistryPostProcessor...postProcessBeanDefinitionRegistry中的bean的個數為:"+count);
//想注冊器中注冊我們自定義的bean 其中hello為bean的名字
BeanDefinitionBuilder beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Black.class);
AbstractBeanDefinition definition = beanDefinition.getBeanDefinition();
beanDefinitionRegistry.registerBeanDefinition("hello",definition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
int count = configurableListableBeanFactory.getBeanDefinitionCount();
System.out.println("MyBeanDefinitionRegistryPostProcessor...postProcessBeanFactory中的bean的個數為:"+count);
}
上述代碼中需要我們注意的一點是注解@Component,其中我們利用#postProcessBeanDefinitionRegistry(...)方法進行自定義bean的注冊功能
- 2.編寫我們的 配置類
@Configuration
@ComponentScan(value = "com.cacmp.bean.expand")
public class ExpandConfig {
}
- 3.測試類
@Test
public void testExpand(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExpandConfig.class);
applicationContext.close();
}
- 來看測試結果

image.png
會發(fā)現我們自己要注冊的bean【hello】也會被注冊進去,這就是BeanDefinitionRegistryPostProcessor的作用