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