Spring源码情操陶冶-AbstractApplicationContext#registerBeanPostProcessors
承接前文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));}
小结
- 获取beanFactory中的所有实现postProcessor接口的bean对象按照优先级有序的放置在beanFactory的内部属性beanPostProcessors集合中,但是并没有执行其中的相应公共方法
- 新增两个BeanPostProcessor实现类:BeanPostProcessorChecker为首,ApplicationListenerDetector为尾
下节预告
Spring源码情操陶冶-AbstractApplicationContext#initMessageSource
转载于:https://www.cnblogs.com/question-sky/p/6825588.html
Spring源码情操陶冶-AbstractApplicationContext#registerBeanPostProcessors相关推荐
- Spring 源码分析之AbstractApplicationContext源码分析
首先我觉得分析ApplicationContext必须从它的实现类开始进行分析,AbstractApplicationContext我觉得是一个不错的选择,那我们就从这里开始逐一分析吧,首先我自己手画 ...
- spring源码解读系列(八):观察者模式--spring监听器详解
一.前言 在前面的文章spring源码解读系列(七)中,我们继续剖析了spring的核心refresh()方法中的registerBeanPostProcessors(beanFactory)(完成B ...
- spring源码 — 一、IoC容器初始化
IoC容器初始化 注意:本次的spring源码是基于3.1.1.release版本 容器:具有获取Bean功能--这是最基本功能,也是BeanFactory接口定义的主要行为,在添加了对于资源的支持之 ...
- 【Spring源码分析】Bean加载流程概览
代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...
- beaninfo详解源码解析 java_【Spring源码分析】Bean加载流程概览
代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...
- Spring源码分析:Bean加载流程概览及配置文件读取
很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已 ...
- Ioc容器beanDefinition-Spring 源码系列(1)
Ioc容器beanDefinition-Spring 源码系列(1) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器 ...
- Spring源码解析【完整版】--【bilibili地址:https://www.bilibili.com/video/BV1oW41167AV】
[本文为bilibili视频雷丰阳的Spring源码解析的完整版总结文章,其中文章前面大部分为他人博文的搬运,后面补充了其未总结的部分] 一.Java的注解 1. 注解的概念 注释:用文字描述程序,给 ...
- 剖析Spring源码:加载IOC容器
本文接上一篇文章 阅读Spring源码:IOC控制反转前的处理,继续进行下面的分析 首先贴出 Spring bean容器的刷新的核心 11个步骤进行祭拜(一定要让我学会了-阿门) // 完成IoC容器 ...
最新文章
- Android 自定义圆形图片
- 卡耐基梅隆大学提出新型「自适应」技术,可提高「个性化神经机器翻译」质量...
- SD卡中FAT32文件格式快速入门(图文详细介绍)
- 百度地图 key_Android百度地图导航的接入(包含驾车、公交、步行)
- 在idea中把项目上传到GitHub库中
- mysql将大表定时转储_mysql数据库数据定时封装转储
- Linux和Windows下使用printf的差别
- linux 脚本 java_Linux 通过脚本执行Java程序
- HashMap和Hashtable 线程安全性
- 解决mysql无法启动,错误1067
- 代码级操作指南 | 如何在Docker Swarm中运行服务
- JS中var、let、const区别? 用3句话概括
- 英雄联盟服务器维护时间,英雄联盟维护的时间是几点结束 lol维护公告几点结束今天...
- 无锡太湖学院计算机科学技术,无锡太湖学院
- Gartner2015新兴技术炒作曲线图
- 安卓psp模拟器联机教程_侠盗猎车手:血战唐人街PSP版模拟器实测 有链接,有联机教程...
- WeGeek Talk | 美团外卖
- 微信小程序配置多环境
- linu修改open files无效_雷电模拟器修改教程
- MT6755 datasheet资料,MT6755芯片处理器参数
热门文章
- cad2008加载 et拓展工具_译文:8个值得推荐的用于前端开发的性能分析工具「渡一教育」...
- Linux安装RabbitMQ及问题
- Kotlin入门(20)几种常见的对话框
- 写论文的第三天 自建zookeeper集群
- 滑动窗口最大值的golang实现
- Kubernetes PV/PVC/StroageClass 持久化存储简介
- 无人机成为黑客的新工具,可黑掉部分家用的智能设备
- 七个你一定会犯的云安全错误
- AndroidStudio意外崩溃,电脑重启,导致重启打开Androidstudio后所有的import都出错...
- HttpClient4.3.x的连接管理