当前位置: 首页 > news >正文

Spring Bean生命周期-registerBeanPostProcessors(七)

ApplicationContext刷新的时候上一步提到了,先调用BeanFactoryPostProcessors预处理下BeanFactory,现在注册Bean processors来拦截Bean的创建。

实例化,然后调用所有注册的BeanPostProcessor bean。如果指定了顺序,会按照顺序执行。
必须在应用Bean实例化之前调用。

protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
        PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
    }

分析

先看到还是这个工具类,在上步的BeanFactoryPostProcessors中使用的也是它。


img_184dfb966aa100b47ffdc3dee390dcbb.png
image.png

注册BeanPostProcessor的代码如下:

    public static void registerBeanPostProcessors(
            ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
      
      // 获取BeanFactory中注册的类型为BeanPostProcessor.class的bean名称。一般获取到的是实现了BeanPostProcessor接口的Bean
        String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

        // Register BeanPostProcessorChecker that logs an info message when
        // a bean is created during BeanPostProcessor instantiation, i.e. when
        // a bean is not eligible for getting processed by all BeanPostProcessors.
        // 注册一个BeanPostProcessorChecker,用来记录bean在BeanPostProcessor实例化时的信息。
        int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
        beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

        // Separate between BeanPostProcessors that implement PriorityOrdered,
        // Ordered, and the rest.
        // 将BeanPostProcessors分为实现了PriorityOrdered,Ordered等类型
        List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
        List<BeanPostProcessor> internalPostProcessors = new ArrayList<BeanPostProcessor>();
        List<String> orderedPostProcessorNames = new ArrayList<String>();
        List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
        for (String ppName : postProcessorNames) {
            if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
                priorityOrderedPostProcessors.add(pp);
                // 如果BeanPostProcessors也实现了MergedBeanDefinitionPostProcessor接口,加入internalPostProcessors
                if (pp instanceof MergedBeanDefinitionPostProcessor) {
                    internalPostProcessors.add(pp);
                }
            }
            else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
                orderedPostProcessorNames.add(ppName);
            }
            else {
                nonOrderedPostProcessorNames.add(ppName);
            }
        }

        // First, register the BeanPostProcessors that implement PriorityOrdered.
        // 首先注册实现了PriorityOrdered接口的BeanPostProcessors
        sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
        registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

        // Next, register the BeanPostProcessors that implement Ordered.
        // 然后,注册实现了Ordered的BeanPostProcessors
        List<BeanPostProcessor> orderedPostProcessors = new ArrayList<BeanPostProcessor>();
        for (String ppName : orderedPostProcessorNames) {
            BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
            orderedPostProcessors.add(pp);
            if (pp instanceof MergedBeanDefinitionPostProcessor) {
                internalPostProcessors.add(pp);
            }
        }
        sortPostProcessors(beanFactory, orderedPostProcessors);
        registerBeanPostProcessors(beanFactory, orderedPostProcessors);

        // Now, register all regular BeanPostProcessors.
        // 现在注册所有常规的BeanPostProcessors
        List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
        for (String ppName : nonOrderedPostProcessorNames) {
            BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
            nonOrderedPostProcessors.add(pp);
            if (pp instanceof MergedBeanDefinitionPostProcessor) {
                internalPostProcessors.add(pp);
            }
        }
        registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

        // Finally, re-register all internal BeanPostProcessors.
        // 最后注册,所有的internal,也就是实现MergedBeanDefinitionPostProcessor的BeanPostProcessors
        sortPostProcessors(beanFactory, internalPostProcessors);
        registerBeanPostProcessors(beanFactory, internalPostProcessors);
     
     //添加ApplicationListenerDetector的BeanPostProcessor
        beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
    }

整体代码也不难理解,如函数名,就是做了注册BeanPostProcessor

  • 获取实现了BeanPostProcessor的bean Name,最开始Bean的信息注册到了beandifinitionMap中
  • 将获取到的BeanPostProcessor分类,分为PriorityOrdered,Ordered和常规的类型
  • 分别将PriorityOrdered,Ordered和常规的Bean添加进ApplicationContext的beanPostProcessors中,ApplicationContext的beanPostProcessors是ArrayList。
BeanFactory.getBeanNamesForType具体实现

其内部调用的是doGetBeanNamesForType

  • 遍历beanDefinitionNames判断是否符合要求是否为type
  • 遍历manualSingletonNames。

内部有个处理是如果Bean是FactoryBean,其名称前面加上&

private String[] doGetBeanNamesForType(ResolvableType type, boolean includeNonSingletons, boolean allowEagerInit){
            // Check all bean definitions.
            // 检查所有的beanDefinitionNames。
        for (String beanName : this.beanDefinitionNames) {
            // Only consider bean as eligible if the bean name
            // is not defined as alias for some other bean.
            if (!isAlias(beanName)) {
                try {
                    RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
                    // Only check bean definition if it is complete.
                    if (!mbd.isAbstract() && (allowEagerInit ||
                            ((mbd.hasBeanClass() || !mbd.isLazyInit() || isAllowEagerClassLoading())) &&
                                    !requiresEagerInitForType(mbd.getFactoryBeanName()))) {
                        // In case of FactoryBean, match object created by FactoryBean.
                        boolean isFactoryBean = isFactoryBean(beanName, mbd);
                        boolean matchFound = (allowEagerInit || !isFactoryBean || containsSingleton(beanName)) &&
                                (includeNonSingletons || isSingleton(beanName)) && isTypeMatch(beanName, type);
                        if (!matchFound && isFactoryBean) {
                            // In case of FactoryBean, try to match FactoryBean instance itself next.
                            beanName = FACTORY_BEAN_PREFIX + beanName;
                            matchFound = (includeNonSingletons || mbd.isSingleton()) && isTypeMatch(beanName, type);
                        }
                        if (matchFound) {
                            result.add(beanName);
                        }
                    }
                }
               ....
        }

        // Check manually registered singletons too.
        for (String beanName : this.manualSingletonNames) {
            try {
                // In case of FactoryBean, match object created by FactoryBean.
                if (isFactoryBean(beanName)) {
                    if ((includeNonSingletons || isSingleton(beanName)) && isTypeMatch(beanName, type)) {
                        result.add(beanName);
                        // Match found for this bean: do not match FactoryBean itself anymore.
                        continue;
                    }
                    // In case of FactoryBean, try to match FactoryBean itself next.
                    beanName = FACTORY_BEAN_PREFIX + beanName;
                }
                // Match raw bean instance (might be raw FactoryBean).
                if (isTypeMatch(beanName, type)) {
                    result.add(beanName);
                }
            }
            ...
        }

        return StringUtils.toStringArray(result);
}

TODO

  • BeanFactory中beanDefinitionNames,manualSingletonNames等属性深入理解

最后

注册BeanPostProcessor和invokeBeanFactoryPostProcessors很像,并且没什么复杂逻辑。就是将已经注册到beanFacory的Bean筛选出BeanPostProcessor然后添加到ApplicationContext的beanPostProcessor集合中。

相关文章:

  • C#指定用户启动进程
  • ServletRequest和ServletResponse学习笔记
  • Ubuntu16.04 System program problem detected
  • MariaDB10.3 增补AliSQL补丁---安全执行Online DDL
  • shell脚本中打印所有匹配某些关键字符的行或前后各N行
  • 数组遍历的方法(loop)
  • 18-10-11
  • clipboard.js无法复制粘贴
  • android SAF存储访问框架
  • Oracle SQL执行计划基线总结(SQL Plan Baseline)
  • php相关笔记
  • Scss 与 Sass 是什么,他们的区别在哪里?
  • adb connect命令连接多个Android设备
  • python(二) urllib2.URLError
  • nunit单元测试详解
  • Android Volley源码解析
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Java方法详解
  • JS专题之继承
  • k8s如何管理Pod
  • MySQL用户中的%到底包不包括localhost?
  • Webpack 4 学习01(基础配置)
  • 从0实现一个tiny react(三)生命周期
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 浏览器缓存机制分析
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 什么是Javascript函数节流?
  • 携程小程序初体验
  • 因为阿里,他们成了“杭漂”
  • 用jquery写贪吃蛇
  • ​ssh免密码登录设置及问题总结
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (HAL库版)freeRTOS移植STMF103
  • (ros//EnvironmentVariables)ros环境变量
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (十三)Flask之特殊装饰器详解
  • (四)图像的%2线性拉伸
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转)树状数组
  • (转)我也是一只IT小小鸟
  • (转载)利用webkit抓取动态网页和链接
  • .apk 成为历史!
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net core 6 redis操作类
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET多线程执行函数
  • .net反混淆脱壳工具de4dot的使用