首先看一下一个最基本的上下文应该是什么样子
ApplicationContext接口的注释里写的很清楚:
一个基本applicationContext应该提供:spring
大部分上下文都实现了此接口. 此接口除了继承了ApplicaitnContext接口的能力外. 还具备可配置上下文与生命周期管理功能.
其中最重要的是定义了refresh()方法. refresh()功能是加载配置.segmentfault
大部分上下文都继承了此类.AbstractApplicationContext能够说启到承上启下的做用.app
从继承图咱们看, AbstractApplicationContext实现了大部分的接口方法.
其中refresh()方法的实现.为ApplicationContext提供了加载配置的能力.工具
加载的什么配置呢?
其实:所谓加载的配置大部分都是加载Bean
上节分析了BeanFactory存储BeanDefinition与Bean. 而且BeanFactory的createBean()方法能够将BeanDefinition建立成Bean.spa
要想从BeanFactory中获取Bean,就得先有BeanDefinition. 有了BeanDefinition,还要触发BeanDefinition到Bean的建立.code
这里就产生了两个问题:xml
ApplicationContext扮演的角色也就显而易见了.blog
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留下的扩展点。
BeanDefinitionRegistryPostProcessor与BeanFactoryPostProcessor与BeanPostProcessor区别:
BeanDefinition是物料
Bean是成品
BeanFactory 存储物料,存储成品.
ApplicationContext初始化: 搜集物料,入库到BeanFactory, 并触发非懒加载成品的建立.
欢迎你们关注个人公众号【源码行动】,最新我的理解及时奉送。