spring源码分析系列4:ApplicationContext研究
2019-10-12 08:38:34来源:博客园 阅读 ()
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, 并触发非懒加载成品的创建.
欢迎大家关注我的公众号【源码行动】,最新个人理解及时奉送。
原文链接:https://www.cnblogs.com/smallstudent/p/11658518.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Spring系列.ApplicationContext接口 2020-06-11
- springboot2配置JavaMelody与springMVC配置JavaMelody 2020-06-11
- 给你一份超详细 Spring Boot 知识清单 2020-06-11
- SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis 2020-06-11
- 掌握SpringBoot-2.3的容器探针:实战篇 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash