承接前文Spring源码情操陶冶-AbstractApplicationContext#invokeBeanFactoryPostProcessors

瞧瞧官方注释

    /*** Instantiate and invoke all registered BeanPostProcessor beans,* respecting explicit order if given.* <p>Must be called before any instantiation of application beans.*/

实例化并且调用所有的已注册的BeanPostProcessor beans,其实也就是简单的把DefaultListableFactory中的所有为BeanPostProcessor的实现bean类放置于其内部属性beanPostProcessors List集合中。

直接源码

protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {//调用的是委托类的registerBeanPostProcessors方法      PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);}

间接源码-PostProcessorRegistrationDelegate.registerBeanPostProcessors

public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
//获取beanFactory中的所有实现BeanPostProcessor接口的beanString[] 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.int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;//BeanPostProcessorChecker检查类beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));//此处的实现与上节的invokeBeanFactoryPostProcessors方法一致,这里就省略不赘述了List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanPostProcessor>();List<BeanPostProcessor> internalPostProcessors = new ArrayList<BeanPostProcessor>();List<String> orderedPostProcessorNames = new ArrayList<String>();List<String> nonOrderedPostProcessorNames = new ArrayList<String>();/**省略*/// Finally, re-register all internal BeanPostProcessors.OrderComparator.sort(internalPostProcessors);//主要是调用此方法将所有的postProcessors按照优先级有序的放置在beanFactory的内部属性beanPostProcessors集合中registerBeanPostProcessors(beanFactory, internalPostProcessors);//增加ApplicationListenerDetector类beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));}

小结

  1. 获取beanFactory中的所有实现postProcessor接口的bean对象按照优先级有序的放置在beanFactory的内部属性beanPostProcessors集合中,但是并没有执行其中的相应公共方法
  2. 新增两个BeanPostProcessor实现类:BeanPostProcessorChecker为首,ApplicationListenerDetector为尾

下节预告

Spring源码情操陶冶-AbstractApplicationContext#initMessageSource

转载于:https://www.cnblogs.com/question-sky/p/6825588.html

Spring源码情操陶冶-AbstractApplicationContext#registerBeanPostProcessors相关推荐

  1. Spring 源码分析之AbstractApplicationContext源码分析

    首先我觉得分析ApplicationContext必须从它的实现类开始进行分析,AbstractApplicationContext我觉得是一个不错的选择,那我们就从这里开始逐一分析吧,首先我自己手画 ...

  2. spring源码解读系列(八):观察者模式--spring监听器详解

    一.前言 在前面的文章spring源码解读系列(七)中,我们继续剖析了spring的核心refresh()方法中的registerBeanPostProcessors(beanFactory)(完成B ...

  3. spring源码 — 一、IoC容器初始化

    IoC容器初始化 注意:本次的spring源码是基于3.1.1.release版本 容器:具有获取Bean功能--这是最基本功能,也是BeanFactory接口定义的主要行为,在添加了对于资源的支持之 ...

  4. 【Spring源码分析】Bean加载流程概览

    代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...

  5. beaninfo详解源码解析 java_【Spring源码分析】Bean加载流程概览

    代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...

  6. Spring源码分析:Bean加载流程概览及配置文件读取

    很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已 ...

  7. Ioc容器beanDefinition-Spring 源码系列(1)

    Ioc容器beanDefinition-Spring 源码系列(1) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器 ...

  8. Spring源码解析【完整版】--【bilibili地址:https://www.bilibili.com/video/BV1oW41167AV】

    [本文为bilibili视频雷丰阳的Spring源码解析的完整版总结文章,其中文章前面大部分为他人博文的搬运,后面补充了其未总结的部分] 一.Java的注解 1. 注解的概念 注释:用文字描述程序,给 ...

  9. 剖析Spring源码:加载IOC容器

    本文接上一篇文章 阅读Spring源码:IOC控制反转前的处理,继续进行下面的分析 首先贴出 Spring bean容器的刷新的核心 11个步骤进行祭拜(一定要让我学会了-阿门) // 完成IoC容器 ...

最新文章

  1. Android 自定义圆形图片
  2. 卡耐基梅隆大学提出新型「自适应」技术,可提高「个性化神经机器翻译」质量...
  3. SD卡中FAT32文件格式快速入门(图文详细介绍)
  4. 百度地图 key_Android百度地图导航的接入(包含驾车、公交、步行)
  5. 在idea中把项目上传到GitHub库中
  6. mysql将大表定时转储_mysql数据库数据定时封装转储
  7. Linux和Windows下使用printf的差别
  8. linux 脚本 java_Linux 通过脚本执行Java程序
  9. HashMap和Hashtable 线程安全性
  10. 解决mysql无法启动,错误1067
  11. 代码级操作指南 | 如何在Docker Swarm中运行服务
  12. JS中var、let、const区别? 用3句话概括
  13. 英雄联盟服务器维护时间,英雄联盟维护的时间是几点结束 lol维护公告几点结束今天...
  14. 无锡太湖学院计算机科学技术,无锡太湖学院
  15. Gartner2015新兴技术炒作曲线图
  16. 安卓psp模拟器联机教程_侠盗猎车手:血战唐人街PSP版模拟器实测 有链接,有联机教程...
  17. WeGeek Talk | 美团外卖
  18. 微信小程序配置多环境
  19. linu修改open files无效_雷电模拟器修改教程
  20. MT6755 datasheet资料,MT6755芯片处理器参数

热门文章

  1. cad2008加载 et拓展工具_译文:8个值得推荐的用于前端开发的性能分析工具「渡一教育」...
  2. Linux安装RabbitMQ及问题
  3. Kotlin入门(20)几种常见的对话框
  4. 写论文的第三天 自建zookeeper集群
  5. 滑动窗口最大值的golang实现
  6. Kubernetes PV/PVC/StroageClass 持久化存储简介
  7. 无人机成为黑客的新工具,可黑掉部分家用的智能设备
  8. 七个你一定会犯的云安全错误
  9. AndroidStudio意外崩溃,电脑重启,导致重启打开Androidstudio后所有的import都出错...
  10. HttpClient4.3.x的连接管理