创建一个自定义BeanDefinitionRegistryPostProcessor。
importorg.springframework.beans.BeansException;importorg.springframework.beans.factory.config.ConfigurableListableBeanFactory;importorg.springframework.beans.factory.support.AbstractBeanDefinition;importorg.springframework.beans.factory.support.BeanDefinitionBuilder;importorg.springframework.beans.factory.support.BeanDefinitionRegistry;importorg.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;importorg.springframework.stereotype.Component;@ComponentpublicclassMyBeanDefinitionRegistryPostProcessorimplementsBeanDefinitionRegistryPostProcessor{@OverridepublicvoidpostProcessBeanFactory(ConfigurableListableBeanFactorybeanFactory)throwsBeansException{//TODOAuto-generatedmethodstubSystem.out.println("postProcessBeanFactory...bean的数量:"+beanFactory.getBeanDefinitionCount());}//BeanDefinitionRegistryBean定义信息的保存中心,以后BeanFactory就是按照BeanDefinitionRegistry里面保存的每一个bean定义信息创建bean实例;@OverridepublicvoidpostProcessBeanDefinitionRegistry(BeanDefinitionRegistryregistry)throwsBeansException{//TODOAuto-generatedmethodstubSystem.out.println("postProcessBeanDefinitionRegistry...bean的数量:"+registry.getBeanDefinitionCount());//RootBeanDefinitionbeanDefinition=newRootBeanDefinition(Blue.class);AbstractBeanDefinitionbeanDefinition=BeanDefinitionBuilder.rootBeanDefinition(Blue.class).getBeanDefinition();registry.registerBeanDefinition("hello",beanDefinition);}}
配置类、测试类
@Configuration@ComponentScan("com.demo")publicclassSpringConfig{}@Testpublicvoidtest(){AnnotationConfigApplicationContextapplicationContext=newAnnotationConfigApplicationContext(SpringConfig.class);applicationContext.close();}
输出结果
postProcessBeanDefinitionRegistry...bean的数量:9postProcessBeanFactory...bean的数量:10MyBeanFactoryPostProcessor...postProcessBeanFactory...当前BeanFactory中有10个Bean[org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,springConfig,myBeanDefinitionRegistryPostProcessor,myBeanFactoryPostProcessor,hello]blue...constructor
可以发现postProcessBeanDefinitionRegistry方法在postProcessBeanFactory之前执行,因为在postProcessBeanDefinitionRegistry中注入一个Bean,所以到postProcessBeanFactory方法中已经多了一个Bean。