spring源码分析系列4:ApplicationContext研究
ApplicationContext接口
首先看一下一个最基本的上下文应该是什么样子

ApplicationContext接口的注释里写的很清楚:
一个基本applicationContext应该提供:
- 访问Bean的能力
- 提供加载资源的能力
- 发布事件的能力
- 解析消息、支持国际化的能力
AbstractApplicationContext承上启下

ConfigurableApplicationContext接口:
大部分上下文都实现了此接口. 此接口除了继承了ApplicaitnContext接口的能力外. 还具有可配置上下文与生命周期管理功能.
其中最重要的是定义了refresh()方法. refresh()功能是加载配置.
AbstractApplicationContext抽象类:
大部分上下文都继承了此类.AbstractApplicationContext可以说启到承上启下的作用.
从继承图我们看, AbstractApplicationContext实现了大部分的接口方法.
其中refresh()方法的实现.为ApplicationContext提供了加载配置的能力.
加载的什么配置呢?
其实:所谓加载的配置大部分都是加载Bean
ApplicationContext与BeanFactory关系
上节分析了BeanFactory存储BeanDefinition与Bean. 并且BeanFactory的createBean()方法可以将BeanDefinition创建成Bean.
要想从BeanFactory中获取Bean,就得先有BeanDefinition. 有了BeanDefinition,还要触发BeanDefinition到Bean的创建.
这里就产生了两个问题:
- BeanDefinition从哪里来?
- 创建过程在哪里触发的?
ApplicationContext扮演的角色也就显而易见了.
ApplicationContext初始化的核心工作是将散落在各个目录下的各种配置形式的Bean定义,搜集起来解析成BeanDefinition并入库到BeanFactory.然后触发BeanDefinition创建成Bean,存到BeanFactory中
至此: 整个spring启动的脉络就也清晰了. 两大块:Bean定义的搜集+Bean的创建.
[开发人员]--标注-->[Bean定义] --搜集--> [BeanDefinition] --创建-->[Bean]
ApplicationContext重要工作
开发人员常用的标注Bean定义的方式有.
- xml文件标注Bean定义
- 注解标注Bean定义
ApplicationContext将这些Bean定义转为BeanDefinition并不是那么容易.
第一步搜集:需要把散落的Bean定义的载体找到.搜集起来.(注意,ApplicationContext搜集Bean定义的过程其实也是通过调用工具来执行的)
- XML对应的有XmlBeanDefinitionReader 搜集器
- 注解JavaConfig对应的有ClassPathBeanDefinitionScanner收集器
第二步解析.将XML或者JavaConfig中的标注了Bean定义的转为BeanDefinition
第三步:扩展点.BeanFactoryPostProcessor.实现了此接口的类可以在BeanDefinition入库到BeanFactory的这个阶段中,修改BeanDefinition信息.这也是spring留下的扩展点。
BeanDefinitionRegistryPostProcessor与BeanFactoryPostProcessor与BeanPostProcessor区别:
- BeanFactoryPostProcessor:可以修改BeanDefinition。发生在BeanDefinition入库到BeanFactory阶段.
- BeanDefinitionRegistryPostProcessor继承与BeanFactoryPostProcessor:单从名字上看,我们可以看出,这个PostProcessor跟BeanDefinition注册有关。他发生的阶段比BeanFactoryPostProcessor更早,他用来注册BeanDefinition用。实现了此接口的可以看作一个BeanDefinition扫描注册器。
- BeanPostProcessor: 发生在BeanDefinition创建Bean阶段。
总结:
BeanDefinition是物料
Bean是成品
BeanFactory 存储物料,存储成品.
ApplicationContext初始化: 搜集物料,入库到BeanFactory, 并触发非懒加载成品的创建.
欢迎大家关注我的公众号【源码行动】,最新个人理解及时奉送。

spring源码分析系列4:ApplicationContext研究的更多相关文章
- 【Spring源码分析系列】ApplicationContext 相关接口架构分析
[原创文章,转载请注明出处][本文地址]http://www.cnblogs.com/zffenger/p/5813470.html 在使用Spring的时候,我们经常需要先得到一个Applicati ...
- spring源码分析系列5:ApplicationContext的初始化与Bean生命周期
回顾Bean与BeanDefinition的关系. BeanFactory容器. ApplicationContext上下文. 首先总结下: 开发人员定义Bean信息:分为XML形式定义:注解式定义 ...
- spring源码分析系列 (8) FactoryBean工厂类机制
更多文章点击--spring源码分析系列 1.FactoryBean设计目的以及使用 2.FactoryBean工厂类机制运行机制分析 1.FactoryBean设计目的以及使用 FactoryBea ...
- spring源码分析系列
spring源码分析系列 (1) spring拓展接口BeanFactoryPostProcessor.BeanDefinitionRegistryPostProcessor spring源码分析系列 ...
- spring源码分析系列 (5) spring BeanFactoryPostProcessor拓展类PropertyPlaceholderConfigurer、PropertySourcesPlaceholderConfigurer解析
更多文章点击--spring源码分析系列 主要分析内容: 1.拓展类简述: 拓展类使用demo和自定义替换符号 2.继承图UML解析和源码分析 (源码基于spring 5.1.3.RELEASE分析) ...
- spring源码分析系列 (1) spring拓展接口BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor
更多文章点击--spring源码分析系列 主要分析内容: 一.BeanFactoryPostProcessor.BeanDefinitionRegistryPostProcessor简述与demo示例 ...
- spring源码分析系列 (3) spring拓展接口InstantiationAwareBeanPostProcessor
更多文章点击--spring源码分析系列 主要分析内容: 一.InstantiationAwareBeanPostProcessor简述与demo示例 二.InstantiationAwareBean ...
- spring源码分析系列 (2) spring拓展接口BeanPostProcessor
Spring更多分析--spring源码分析系列 主要分析内容: 一.BeanPostProcessor简述与demo示例 二.BeanPostProcessor源码分析:注册时机和触发点 (源码基于 ...
- spring源码分析系列 (15) 设计模式解析
spring是目前使用最为广泛的Java框架之一.虽然spring最为核心是IOC和AOP,其中代码实现中很多设计模式得以应用,代码看起来简洁流畅,在日常的软件设计中很值得借鉴.以下是对一些设计模式的 ...
随机推荐
- HDU 6634 网络流最小割模型 启发式合并
如果我们先手拿完所有苹果再去考虑花费的话. S -> 摄像头 -> 苹果 -> T 就相当于找到一个最小割使得S和T分开. ans = sum - flow. 然后对于这一个模型, ...
- debug 模式缓慢
debug 模式启动服务器,然后在 breakopints下可以看到打的断点.清除全部重启服务器,问题解决.
- Java静态代码块、代码块及构造函数执行顺序
根据以下程序进行分析 定义一个父类 package sas.LearnJava; public class ExcuteOrderTest { { System.out.println("我 ...
- vim 高级功能
本文章原创首发于公众号:编程三分钟 ,文末二维码. 文本编辑.跳转.删除.复制.替换这些操作用vim确实是快:但是好像仅仅是这样根本不能说服我vim超过鼠标的地方. 花点时间弄熟这些,除了炫技意外,主 ...
- 洛谷 P1101单词方阵
我已经,是这个世界上,最幸福的女孩了 ——<末日时 ...
- java对象与java对象引用的区别
java对象与java对象引用的区别 对象与对象引用的区别 直接用例子说话吧 Person per = new Person("张三"); 这一条语句,其实包括了四个动作: 右边的 ...
- 修改和编译spring源码,构建jar(spring-context-4.0.2.RELEASE)
上周在定位问题时,发现Spring容器实例化Bean的时候抛出异常,为了查看更详细的信息,决定修改spring-context-4.0.2.RELEASE.jar中的CommonAnnotationB ...
- js 正则表达式:价格的校验
/*验证单价:包括两位小数*/var priceReg = /(^[1-9]\d*(\.\d{1,2})?$)|(^0(\.\d{1,2})?$)/;var price=$("#price& ...
- Linux 笔记 - 第六章 Linux 磁盘管理
博客地址:http://www.moonxy.com 一.前言 1.1 硬盘 硬盘一般分为 IDE 硬盘.SCSI 硬盘和 SATA 硬盘.在 Linux 中,IDE 接口的设备被称为 hd,SCSI ...
- String的优化 Stringbuffer和Stringbuilder
string 上次说到string是最好衍生出来的一种字符类型,实现原理是由char[].我们知道数组一旦创建时不可更改的,所以每一次进行字符串的拼接都是在new一个新的字符串进行添加,这样的话对内存 ...