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研究的更多相关文章

  1. 【Spring源码分析系列】ApplicationContext 相关接口架构分析

    [原创文章,转载请注明出处][本文地址]http://www.cnblogs.com/zffenger/p/5813470.html 在使用Spring的时候,我们经常需要先得到一个Applicati ...

  2. spring源码分析系列5:ApplicationContext的初始化与Bean生命周期

    回顾Bean与BeanDefinition的关系. BeanFactory容器. ApplicationContext上下文. 首先总结下: 开发人员定义Bean信息:分为XML形式定义:注解式定义 ...

  3. spring源码分析系列 (8) FactoryBean工厂类机制

    更多文章点击--spring源码分析系列 1.FactoryBean设计目的以及使用 2.FactoryBean工厂类机制运行机制分析 1.FactoryBean设计目的以及使用 FactoryBea ...

  4. spring源码分析系列

    spring源码分析系列 (1) spring拓展接口BeanFactoryPostProcessor.BeanDefinitionRegistryPostProcessor spring源码分析系列 ...

  5. spring源码分析系列 (5) spring BeanFactoryPostProcessor拓展类PropertyPlaceholderConfigurer、PropertySourcesPlaceholderConfigurer解析

    更多文章点击--spring源码分析系列 主要分析内容: 1.拓展类简述: 拓展类使用demo和自定义替换符号 2.继承图UML解析和源码分析 (源码基于spring 5.1.3.RELEASE分析) ...

  6. spring源码分析系列 (1) spring拓展接口BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor

    更多文章点击--spring源码分析系列 主要分析内容: 一.BeanFactoryPostProcessor.BeanDefinitionRegistryPostProcessor简述与demo示例 ...

  7. spring源码分析系列 (3) spring拓展接口InstantiationAwareBeanPostProcessor

    更多文章点击--spring源码分析系列 主要分析内容: 一.InstantiationAwareBeanPostProcessor简述与demo示例 二.InstantiationAwareBean ...

  8. spring源码分析系列 (2) spring拓展接口BeanPostProcessor

    Spring更多分析--spring源码分析系列 主要分析内容: 一.BeanPostProcessor简述与demo示例 二.BeanPostProcessor源码分析:注册时机和触发点 (源码基于 ...

  9. spring源码分析系列 (15) 设计模式解析

    spring是目前使用最为广泛的Java框架之一.虽然spring最为核心是IOC和AOP,其中代码实现中很多设计模式得以应用,代码看起来简洁流畅,在日常的软件设计中很值得借鉴.以下是对一些设计模式的 ...

随机推荐

  1. MongoDb 快速翻页方法

    翻阅数据是MongoDB最常见的操作之一.一个典型的场景是需要在你的用户界面中显示你的结果.如果你是批量处理的数据,同样重要的是要让你的分页策略正确,以便你的数据处理可以规模化. 接下来,让我们通过一 ...

  2. Java 中创建对象的 5 种方式!

    Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码 Employee类: class Employee implements Cloneable, Serializable { pri ...

  3. 彻底解决android拍照后无法显示的问题

    这是对上篇"android 图片拍照,相册选图,剪切并显示"的文章之后的 改进 上一篇文章虽然能解决图片的拍照剪切以及显示,但是发现他有一个缺点, 如果该程序单独运行,貌似没有任何 ...

  4. Golang error 的突围

    目录 error 的困局 尝试破局 Errors are just values handle not just check errors Only handle errors once 小结 胎死腹 ...

  5. Windows 7 上怎样打开SQL Server 配置管理器

    场景 在Windows 7 上打开 SQL Server 的配置管理器. 实现 右击电脑--管理 在计算机管理--服务和应用程序-SQL Server 配置管理器 注: 博客首页: https://b ...

  6. linux环境上anaconda的安装与卸载

    首先下载linux上anaconda的安装包: $ wget https://repo.anaconda.com/archive/Anaconda3-5.1.0-Linux-x86_64.sh 然后赋 ...

  7. win下的mongodb安装和基础操作

    一.下载地址: https://www.mongodb.com/download-center/community 二.安装错误: 1.安装过程中报错(类似下图): 原因:没有管理员权限 解决:管理员 ...

  8. Python实现语音识别和语音合成

    声音的本质是震动,震动的本质是位移关于时间的函数,波形文件(.wav)中记录了不同采样时刻的位移. 通过傅里叶变换,可以将时间域的声音函数分解为一系列不同频率的正弦函数的叠加,通过频率谱线的特殊分布, ...

  9. git使用和操作

    git提交日志的规范 为了更规范的开发,特别是团队协同开发,对于代码托管工具的提交上都会有要求的. 作为开发者,我们一定要注重提交日志的规范性,我们要对自己写的代码负责.提交日志规范很多,最近看到了一 ...

  10. [Leetcode] 第324题 摆动排序II

    一.题目描述 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序. 示例 1: 输入: nums ...