Spring扩展组件

扩展组件代码
测试代码

1.BeanFactoryPostProcessor

BeanFactoryPostProcessor:beanFactory的后置处理器。
作用如下:

  • a)在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容;
  • b)所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建

注意:之前也讲过BeanPostProcessor,它是bean后置处理器,bean创建对象初始化前后进行拦截工作的

@Component
public class JamesBeanFactoryPostProcessor implements BeanFactoryPostProcessor{

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("JamesBeanFactoryPostProcessor.....调用了BeanFactoryPostProcessor.postProcessBeanFactory()");
        //所有bean的定义,已经加载到beanFactory, 但是bean实例还没创建
        int count = beanFactory.getBeanDefinitionCount();
        String[] beanDefName = beanFactory.getBeanDefinitionNames();
        System.out.println("当前BeanFactory中有"+count+"个Bean");
        System.out.println(Arrays.asList(beanDefName));
        
    }

}

结果:

JamesBeanFactoryPostProcessor.....调到了BeanFactoryPostProcessor.postProcessBeanFactory()
当前BeanFactory中有11个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, ch12MainConfig, jamesBeanDefinitionRegistryPostProcessor, jamesBeanFactoryPostProcessor, getMoon, hello]
Moon constructor........
  • 调用时机(调用栈)


2.BeanDefinitionRegistryPostProcessor

@Component
public class JamesBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("JamesBeanDefinitionProcessor..postProcessBeanFactory(),Bean的数量"+beanFactory.getBeanDefinitionCount());
    }

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        System.out.println("amesBeanDefinition.postProcessBeanDefinitionRegistry()...bean的数量"+registry.getBeanDefinitionCount());
        //RootBeanDefinition rbd = new RootBeanDefinition(Moon.class);
        AbstractBeanDefinition rbd = BeanDefinitionBuilder.rootBeanDefinition(Moon.class).getBeanDefinition();
        registry.registerBeanDefinition("hello", rbd);
    }
}

结果:

amesBeanDefinition.postProcessBeanDefinitionRegistry()...bean的数量10
JamesBeanDefinitionProcessor..postProcessBeanFactory(),Bean的数量11
Moon constructor........

调用栈为:


3.总结

先执行BeanDefinitionRegistryPostProcessor的处理器,而BeanFactoryPostProcessor的处理器在它后面执行。

参考

  • 1)享学课堂James老师笔记
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容