• 10. Spring源码篇之BeanPostProcessor


    简介

    在Bean的创建过程中会有很多的后置处理器,例如实例化前、实例化后、初始化前、初始化后,属性填充等,这些都是通过BeanPostProcessor来实现的

    那么既然每个Bean都有有这些生命周期,这些BeanPostProcessor肯定需要提前知道,并且实例化出来保存,而我们前面介绍来BeanDefinition的扫描,就可以把所有的Bean找出来,只要在实例化单例Bean之前把BeanPostProcessor实例化好就行了

    在spring中就有这么一步注册BeanPostProcessor
    就在AbstractApplicationContext#refresh方法中的一步registerBeanPostProcessors(beanFactory);

    源码解析

    public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
    
        // 通过getBeanNamesForType可以拿到所有的名字,因为这个时候还没有实例化,所以就拿到名字,里面使用isTypeMatch匹配
        String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
    
        List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();    // 找出所有实现 PriorityOrdered的BeanPostProcessor
        List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();    // 内置的BeanPostProcessor 如 MergedBeanDefinitionPostProcessor
        List<String> orderedPostProcessorNames = new ArrayList<>();    // 找出所有实现 Ordered的BeanPostProcessor
        List<String> nonOrderedPostProcessorNames = new ArrayList<>();    // 没有任何排序的BeanPostProcessor
        
        for (String ppName : postProcessorNames) {
            if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                // 通过getBean获得BeanPostProcessor对象
                BeanPostProcessor pp = 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);
            }
        }
    
        sortPostProcessors(priorityOrderedPostProcessors, beanFactory);    // 升序排序
        registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); // 注册BeanPostProcessors
        
        List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
        for (String ppName : orderedPostProcessorNames) {
            BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);         // 通过getBean获得BeanPostProcessor对象
            orderedPostProcessors.add(pp);
            if (pp instanceof MergedBeanDefinitionPostProcessor) {
                internalPostProcessors.add(pp);
            }
        }
        sortPostProcessors(orderedPostProcessors, beanFactory);    // 升序排序
        registerBeanPostProcessors(beanFactory, orderedPostProcessors); // 注册BeanPostProcessors
    
        List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
        for (String ppName : nonOrderedPostProcessorNames) {
            BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);  // 通过getBean获得BeanPostProcessor对象
            nonOrderedPostProcessors.add(pp);
            if (pp instanceof MergedBeanDefinitionPostProcessor) {
                internalPostProcessors.add(pp);
            }
        }
        registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
    
        sortPostProcessors(internalPostProcessors, beanFactory);     // 升序排序 MergedBeanDefinitionPostProcessor排在最后
        registerBeanPostProcessors(beanFactory, internalPostProcessors);
    
        beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext)); //注册 ApplicationListenerDetector 这个后续将
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    注册也会有个先后顺序,首先是实现了PriorityOrdered的排在前面,然后是实现Ordered接口的,再然后是没有现实排序接口的,最后是内置的例如MergedBeanDefinitionPostProcessor

    这些BeanPostProcessor都会注册,通过beanFactory缓存起来

    private final List<BeanPostProcessor> beanPostProcessors = new BeanPostProcessorCacheAwareList();
    
    public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
        Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
        this.beanPostProcessors.remove(beanPostProcessor);
        this.beanPostProcessors.add(beanPostProcessor);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    总结

    从上面的代码中可以看出,在其他的单例Bean实例化之前,会先把BeanPostProcessor实例化好,并且排序

    后面讲实例化前的BeanPostProcessor


    欢迎关注,学习不迷路!

  • 相关阅读:
    Linux Centos/Debian NFS服务器查询搭建与配置
    1.5-11:整数的个数
    Redis缓存更新策略、详解并发条件下数据库与缓存的一致性问题以及消息队列解决方案
    VUE3.0+Antdv+Asp.net WebApi开发学生信息管理系统(三)
    吉时利静电计在新能源电池测试方案的应用
    【SQL】新建库表时,报错attempt to write a readonly database
    蓝桥杯之我见
    ubuntu22.04设置中文
    一文看懂推荐系统:排序14:PNN模型(Product-based Neural Networks),和FNN一个作者,干掉FM,加上LR+Product
    MySQL修改root账号密码
  • 原文地址:https://blog.csdn.net/weixin_44412085/article/details/134486172