接上一篇博客:https://www.cnblogs.com/wwjj4811/p/14541579.html
BeanFactoryPostProcessor接口下有一个子接口BeanDefinitionRegistryPostProcessor。
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
/**
* Modify the application context's internal bean definition registry after its
* standard initialization. All regular bean definitions will have been loaded,
* but no beans will have been instantiated yet. This allows for adding further
* bean definitions before the next post-processing phase kicks in.
* @param registry the bean definition registry used by the application context
* @throws org.springframework.beans.BeansException in case of errors
*/
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
}
根据英文注释,不难理解此接口的方法在所有bean定义信息将要被加载,bean实例还未创建的时候调用。
所以BeanDefinitionRegistryPostProcessor
的方法调用还要在BeanFactoryPostProcessor
调用之前,因为BeanFactoryPostProcessor
调用时机在所有bean定义已经保存加载到beanFactory了。
测试:
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor
{
//BeanDefinitionRegistry:bean定义信息的保存中心
//以后beanFactory就是按照BeanDefinitionRegistry里面保存的bean定义信息创建bean实例
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
System.out.println("MyBeanDefinitionRegistryPostProcessor postProcessBeanDefinitionRegistry");
System.out.println(registry.getBeanDefinitionCount());
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Blue.class).getBeanDefinition();
registry.registerBeanDefinition("hello", beanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("MyBeanDefinitionRegistryPostProcessor postProcessBeanFactory");
System.out.println(beanFactory.getBeanDefinitionCount());
}
}
@ComponentScan
@Configuration
public class ExtConfig {
}
public class MainTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class);
((AnnotationConfigApplicationContext) applicationContext).close();
}
}
BeanDefinitionRegistryPostProcessor
优先与BeanFactoryPostProcessor
执行,所以我们可以利用BeanDefinitionRegistryPostProcessor
该容器中额外添加一些组件
原理:
大致流程与BeanFactoryPostProcessor
相同:
最后再调用其他的BeanDefinitionRegistryPostProcessor
后面紧接着就会调用BeanFactoryPostProcessor
接口的方法