• 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, 并触发非懒加载成品的创建.
    欢迎大家关注我的公众号【源码行动】,最新个人理解及时奉送。
    在这里插入图片描述

  • 相关阅读:
    【tarjan】【树的直径】【CF】K. Königsberg Bridges
    【组合数学】【恒等式】简单和、交错和
    【组合数学】【恒等式】$sum_{k=0}^{r}C_m^k imes C_{n}^{r-k}=C_{m+n}^r$
    【组合数学】【恒等式】$C_{n}^{r} imes C_{n-r}^{k-r}=C_{n}^{k} imes C_k^{r}$
    【树形DP】D. Serval and Rooted Tree
    【图论】图的欧拉定理
    【图论】网络流解决二分图最大匹配量问题
    【计算几何】atan2函数
    【单峰计数DP】Problem F – Fabricating Sculptures
    Java基础之:自定义泛型
  • 原文地址:https://www.cnblogs.com/smallstudent/p/11658518.html
Copyright © 2020-2023  润新知