spring 相关

spring容器(五):注册BeanPostProcessor到

2019-06-29  本文已影响0人  aix91

上一章中讲解了: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;
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读