spring容器(五):注册BeanPostProcessor到容器

上一章中讲解了:BeanPostProcessorFactory方法的调用,给BeanFactory中引入类BeanPostProcessor类。这一章,我们来看看spring容器在创建时,如何添加BeanPostProcessor。

1. registerBeanPostProcessors:注册BeanPostProcessor到容器

public static void registerBeanPostProcessors( ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
    //获取BeanFactory中的BeanPostProcessor类
    String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
    
    //添加了BeanPostProcessorChecker
    beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

    //将BeanPostProcessor按照PriorityOrdered->Orderd->Normal顺序来整理BeanPostProcessor
    List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
    List<BeanPostProcessor> internalPostProcessors = new ArrayList<BeanPostProcessor>();
    List<String> orderedPostProcessorNames = new ArrayList<String>();
    List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
    
     ...
    // 首先排序PriorityOrdered的BeanPostProcessor,然后注册到BeanFactory中
    sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
    registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

    // 接下来是Ordered->normal->internal

    //最后添加了ApplicationListenerDetector的BeanPostProcessor
    beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));

}

2. addBeanPostProcessor

将BeanPostProcessor存放在List中,以备后续创建Bean时使用。

@Override
    public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
        Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
        this.beanPostProcessors.remove(beanPostProcessor);
        this.beanPostProcessors.add(beanPostProcessor);
        if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) {
            this.hasInstantiationAwareBeanPostProcessors = true;
        }
        if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) {
            this.hasDestructionAwareBeanPostProcessors = true;
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • “不要!” 紅色的地毯 ,一個約莫五六歲的孩子,就這樣被後面的人拖著衣領走着,那底是誰?莫紗不停地哭着, 從小到大...
    8d39c98acad4阅读 197评论 1 0