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,其中代码实现中很多设计模式得以应用,代码看起来简洁流畅,在日常的软件设计中很值得借鉴.以下是对一些设计模式的 ...
随机推荐
- CodeForces 669 E Little Artem and Time Machine CDQ分治
题目传送门 题意:现在有3种操作, 1 t x 在t秒往multiset里面插入一个x 2 t x 在t秒从multiset里面删除一个x 3 t x 在t秒查询multiset里面有多少x 事情是按 ...
- 牛客多校第七场 C Bit Compression 思维
链接:https://www.nowcoder.com/acm/contest/145/C来源:牛客网 A binary string s of length N = 2n is given. You ...
- codeforces 572 D. Minimization(dp+ 思维)
题目链接:http://codeforces.com/contest/572/problem/D 题意:给出一个序列,可以任意调整序列的顺序,使得给出的式子的值最小 题解:显然要先排一下序,然后取相邻 ...
- hdu 2895 01背包 Robberies
Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- POJ 3786 dp-递推 Adjacent Bit Counts *
Adjacent Bit Counts Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 599 Accepted: 502 ...
- HDU 5793 A Boring Question 多校训练
There are an equation. ∑0≤k1,k2,⋯km≤n∏1⩽j<m(kj+1kj)%1000000007=?∑0≤k1,k2,⋯km≤n∏1⩽j<m(kj+1kj)%1 ...
- 安卓手机360浏览器神奇bug,难以理解的
今天渠道组,说广告在安卓手机360浏览器上显示不了,我就去排查这个问题,发现所有安卓浏览器还真看不到广告,本来以为是360浏览器屏蔽了,,但是另一个项目就没事,后来经过几个小时的不断alert断点调试 ...
- 环境变量_JAVA_LAUNCHER_DEBUG,它能给你更多的JVM信息
关于环境: 本文中的实战都是在docker容器中进行的,容器的出处请参照<在docker上编译openjdk8>一文,里面详细的说明了如何构造镜像和启动容器. 在上一篇文章<修改,编 ...
- 关于jpa的Specification自定义函数,实现oracle的decode;以及如何在静态方法中调用注入的service
如何在静态方法中调用注入的service Public class ClassA{ public static ClassA classA; @Resource private Service ser ...
- 爬取凤凰网站财经类的新闻,函数时编程,可全部实现,由于内容量大,需要时间太长,服务器会禁止,为了防止,可以将time.sleep()设置的时间长点
import requests from selenium import webdriver import time def grasp(urlT): driver = webdriver.Chrom ...