BeanPostProcessor

先来分析一下beanPostProcessor的注册.BeanPostProcessor的调用是在bean的实例化阶段进行的.
自定义一个后处理器:

public class MyInstantiationAwareBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("*************");
        return null;
    }
}

配置文件:

<bean class="com.ipluto.demo.MyInstantiationAwareBeanPostProcessor" />

使用最基本的beanFactory方式进行Spring的bean的加载的时候,不会有任何变化,因为我们只是定义了一个beanPostProcessor,并没有注册到beanFactory中,但是使用ApplicationContext方式获取bean的时候会在获取每个bean的时候打印出“*******”,这个特性就是在registerBeanPostProcessors中实现的.

public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
		// 获取容器中所有BeanPostProcessor类型的bean
        String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
        int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
        // beanPostProcessorChecker是一个普通的信息打印,可能有些情况,
        // 当spring的配置中的后处理器还没有被注册就已经开始了bean的初始化时
        // 便会打印出beanPostProcessorChecker中设定的信息
        beanFactory.addBeanPostProcessor(new PostProcessorRegistrationDelegate.BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
      	// 使用priorityOrdered保证顺序
        List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList();
        // MergedBeanDefinitionPostProcessor
        List<BeanPostProcessor> internalPostProcessors = new ArrayList();
        // 使用ordered保证顺序
        List<String> orderedPostProcessorNames = new ArrayList();
        // 无序beanPostProcessor
        List<String> nonOrderedPostProcessorNames = new ArrayList();
        String[] var8 = postProcessorNames;
        int var9 = postProcessorNames.length;

        String ppName;
        BeanPostProcessor pp;
        for(int var10 = 0; var10 < var9; ++var10) {
        	// 遍历,并根据不同的排序方式,放到对应的集合中
            ppName = var8[var10];
            if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class);
                priorityOrderedPostProcessors.add(pp);
                if (pp instanceof MergedBeanDefinitionPostProcessor) {
                    internalPostProcessors.add(pp);
                }
            } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
                orderedPostProcessorNames.add(ppName);
            } else {
                nonOrderedPostProcessorNames.add(ppName);
            }
        }
		// 第一步,注册所有实现priorityOrdered的BeanPostProcessor
        sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
        registerBeanPostProcessors(beanFactory, (List)priorityOrderedPostProcessors);
        
        // 第二步,注册所有实现Ordered的BeanPostProcessor
        List<BeanPostProcessor> orderedPostProcessors = new ArrayList(orderedPostProcessorNames.size());
        Iterator var14 = orderedPostProcessorNames.iterator();

        while(var14.hasNext()) {
            String ppName = (String)var14.next();
            BeanPostProcessor pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class);
            orderedPostProcessors.add(pp);
            if (pp instanceof MergedBeanDefinitionPostProcessor) {
                internalPostProcessors.add(pp);
            }
        }

        sortPostProcessors(orderedPostProcessors, beanFactory);
        registerBeanPostProcessors(beanFactory, (List)orderedPostProcessors);
        List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList(nonOrderedPostProcessorNames.size());
        Iterator var17 = nonOrderedPostProcessorNames.iterator();

        while(var17.hasNext()) {
            ppName = (String)var17.next();
            pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class);
            nonOrderedPostProcessors.add(pp);
            if (pp instanceof MergedBeanDefinitionPostProcessor) {
                internalPostProcessors.add(pp);
            }
        }
		// 第三步,注册所有不需要排序的BeanPostProcessor
        registerBeanPostProcessors(beanFactory, (List)nonOrderedPostProcessors);
        sortPostProcessors(internalPostProcessors, beanFactory);
		// 第四步,注册所有MergedBeanDefinitionPostProcessor的BeanPostProcessor,并非重复注册
		// registerBeanPostProcessors中会先移除已经存在的BeanPostProcessor
        registerBeanPostProcessors(beanFactory, (List)internalPostProcessors);
        // 添加ApplicationListener探测器
        beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
    }

看一下registerBeanPostProcessors方法

    private static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) {
        if (beanFactory instanceof AbstractBeanFactory) {
            ((AbstractBeanFactory)beanFactory).addBeanPostProcessors(postProcessors);
        } else {
            Iterator var2 = postProcessors.iterator();

            while(var2.hasNext()) {
                BeanPostProcessor postProcessor = (BeanPostProcessor)var2.next();
                beanFactory.addBeanPostProcessor(postProcessor);
            }
        }

    }
	public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
		Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
		// Remove from old position, if any
		this.beanPostProcessors.remove(beanPostProcessor);
		// Add to end of list
		this.beanPostProcessors.add(beanPostProcessor);
	}

可以从addBeanPostProcessor方法中看到,每次先移除之前存储的,再添加进去,这样集合中就不会有重复的.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值