spring源码分析系列4:ApplicationContext研究

简介: spring源码分析系列4:ApplicationContext研究

ApplicationContext接口


首先看一下一个最基本的上下文应该是什么样子


image.png

ApplicationContext接口的注释里写的很清楚: 一个基本applicationContext应该提供:

  • 访问Bean的能力
  • 提供加载资源的能力
  • 发布事件的能力
  • 解析消息、支持国际化的能力


AbstractApplicationContext承上启下


image.png

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, 并触发非懒加载成品的创建.


相关文章
|
13天前
|
XML Java 数据格式
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
23 3
|
12天前
|
存储 Java 程序员
Spring 注册BeanPostProcessor 源码阅读
Spring 注册BeanPostProcessor 源码阅读
|
13天前
|
存储 安全 Java
Spring Security 6.x OAuth2登录认证源码分析
上一篇介绍了Spring Security框架中身份认证的架构设计,本篇就OAuth2客户端登录认证的实现源码做一些分析。
40 2
Spring Security 6.x OAuth2登录认证源码分析
|
5天前
|
Java 数据库连接 Spring
Spring 整合 MyBatis 底层源码解析
Spring 整合 MyBatis 底层源码解析
|
6天前
|
Java Spring 容器
解读spring5源码中实例化单例bean的调用链
解读spring5源码中实例化单例bean的调用链
|
13天前
|
XML Java 数据格式
深度解析 Spring 源码:揭秘 BeanFactory 之谜
深度解析 Spring 源码:揭秘 BeanFactory 之谜
19 1
|
18天前
|
XML Java API
IoC 之 Spring 统一资源加载策略【Spring源码】
IoC 之 Spring 统一资源加载策略【Spring源码】
22 2
|
18天前
|
存储 Java Spring
Spring IOC 源码分析之深入理解 IOC
Spring IOC 源码分析之深入理解 IOC
33 2
|
20天前
|
监控 Java API
【监控】spring actuator源码速读
【监控】spring actuator源码速读
11 1
|
20天前
|
监控 Java 关系型数据库
java版MES系统源码,后端采用 Spring Boot 多模块架构
MES系统采用Vue3的vue-element-plus-admin为后台,Spring Boot多模块架构,支持MySQL、Oracle等数据库,具备SaaS多租户功能。核心功能包括车间计划排程、工艺流程配置、生产质量管理、进度追踪、库存和排班管理等,全面覆盖生产运营关键环节。
java版MES系统源码,后端采用 Spring Boot 多模块架构