• spring源码系列(二):IOC接口设计分析


    这里主要对springIOC接口体系进行简单的概述和分析,具体每个接口详细分析在下面目录:

    参考内容: <Spring技术内幕:深入解析 Spring架构与设计原理> 和 <Spring源码深度解析(第2版)>

    源码查看工具: idea,spring版本5.2.0

    一 主要接口设计图

    idea查看接口关系图,可在图中删除新增画出自定义的关系图,使用del和查看实现类快捷键(ctrl+alt+b)点击即可删除和增加类图

     

    二 第一条线

    通过BeacFactory->HierarchicalBeanFactory->ConfigurableBeanFactory接口功能的叠加,定义了Bean容器基本的功能

    1 BeacFactory定义了基本的IOC容器规范,包括getBean,判断Bean是否单例等方法,接口方法有

    2 HierarchicalBeanFactory增加了获取父容器等方法,使容器具备双亲Ioc的功能,alt+7 查看当前接口的所有方法

     (双亲容器: 容器可以与另一个容器进行父子容器关联。

    这个时候子容器就可以引用父容器中的bean,但是父容器是不能够引用子容器中的bean的,并且各个子容器中定义的bean是互不可见的,

    这样也可以避免因为不同的插件定义了相同的bean而带来的麻烦。)

    3 ConfigurableBeanFactory再增加了设置父容器,设置Bean后置处理器等对Bean的配置,同时继承了SingletonBeanRegistry接口,扩展了注册访问单例Bean的功能

    三 第二条线

    这条线以ApplicationContext接口为核心的接口设计,开发中最常用的容器就是ApplicationContext的实现,在基本容器基础上增加了许多高级特性

    1 ListableBeanFactory接口细化了许多获取Bean功能,比如获取Bean名字和数量,获取同一个class的Bean集合等

     比如以下方法:

    2 ApplicationContext主要增加了一些关于容器本身的一些方法,并且applicationContext通过实现

    MessageSource,  ResourceLoader, ApplicationEventPublisher添加了许多高级容器支持:

     

     3 WebApplicationContext实现了ApplicationContext接口,通常在Web环境中使用

     4 ConfigurableApplicatoinContext也是ApplicationdContext的实现,

       作用就是设置上下文 ID,设置父应用上下文,添加监听器,刷新容器,关闭,判断是否活跃等方法,application只定义了getId等方法

       所以setId方法在子接口中定义,

    refresh()方法也在这个接口中定义,IOC容器启动的主要逻辑基本都在这个方法里面,由他的实现抽象类

    AbstractApplicationContext实现具体逻辑,通过封装在父抽象类中,子类容器可以直接调用,因为大部分容器初始化逻辑都是一样的,所以子容器只需要关注自身特性即可

    四 核心接口详细分析

    BeanFactory

    ConfigurableBeanFactory

    ApplicationContext

    MessageSource

    ListableBeanFactory

    ResourceLoader

    ApplicationEventPublisher

    AutowireCapableBeanFactory

    Environment

    ConfigurableApplicationContext

    WebApplicationContext

    五 核心容器类详细分析

    1 AbstractApplicationContext

    六 特定场景详细分析

    1 IOC容器启动初始化过程分析

    2 解析XML文件过程分析

    七 广告

    最后打个广告,个人整理的所有源码xmind笔记和一些测试代码,在我的码云上面:

    https://gitee.com/houzheng1216/sourcecode

    笔记截图:

  • 相关阅读:
    P1019 单词接龙
    最小生成树模板题POJ
    区间DP
    牛客多校第三场-A-PACM Team-多维背包的01变种
    洛谷P1004 方格取数-四维DP
    牛客多校第二场A run(基础DP)
    P1494 [国家集训队]小Z的袜子(莫队)
    洛谷:过河卒
    Codeforces Round #486 (Div. 3)-B. Substrings Sort
    判断的值是否为空
  • 原文地址:https://www.cnblogs.com/houzheng/p/11801732.html
Copyright © 2020-2023  润新知