• Spring源码IOC部分容器简介【1】


    实验环境:spring-framework-5.0.2、jdk8、gradle4.3.1

    一、Spring中几个概念

    1.1 BeanDefinition

    • Spring IoC容器管理我们定义的各种Bean对象及其相互关系,Bean对象在Spring实现中是以BeanDefinition来描述的。
    • BeanDefinition接口定义了bean的基本属性。
    • AbstractBeanDefinition实现了大部分逻辑,并定义了一些抽象方法交给子类实现。

    1.2 BeanDefinitionRegistry

    BeanDefinitionRegistry接口用于注册beanDefinition,其中定义了register、remove、get、contains、getCount等对beanDefinition操作的方法。

    1.3 BeanDefinitionReader

    • Bean的解析主要就是对Spring配置文件的解析,这个解析过程主要通过BeanDefinitionReader来完成。
    • BeanDefinitionReader接口定义了getRegistry、getResourceLoader、getBeanClassLoader、loadBeanDefinitions等方法。
    • 其中AbstractBeanDefinitionReader内置了BeanDefinitionRegistry、ResourceLoader、ClassLoader,实现了loadBeanDefinitions方法。 
    • BeanDefinitionReaderUtils提供了BeanDefinition的创建、注册等公共方法。

    1.4 BeanFactory

    • BeanFactory:对IOC容器的基本行为做了定义
    • ListableBeanFactory:表示这些Bean可列表化
    • HierarchicalBeanFactory:表示这些Bean 是有继承关系的
    • AutowireCapableBeanFactory :定义Bean的自动装配规则
    • 【重要】DefaultListableBeanFactory:继承上面所有特性,实现了bean的定义和注册逻辑。内置beanDefinitionMap,也就是注册的bean都存在这个map里。

    1.5 ResourceLoader

    • ResourceLoader定义了getResource和getClassLoader方法。
    • DefaultResourceLoader继承ResourceLoader,内置ClassLoader,主要负责资源路径的定义。

    二、Spring容器简介

    2.1 AbstractApplicationContext

    • AbstractApplicationContext是所有容器的父类,使用模板方法模式,提供了几乎ApplicationContext的所有操作。
    • 主要有容器工厂的处理,事件的发送广播,监听器添加,容器初始化操作refresh方法,然后是bean的生成获取方法接口等。

    AbstractApplicationContext继承结构

    AbstractApplicationContext派生体系

    这里我是按继承结构划分为Refreshbale类和Generic类。注意:本文是按照类继承结构来划分的,也可以按照特性划分为Config类和Web类。

    2.2 Refreshable类容器

    2.2.1 AbstractRefreshableApplicationContext抽象类

    • 是个抽象类,继承了父类AbstractApplicationContext的所有能力,负责容器的刷新与创建。
    • 实现了父类的refreshBeanFactory方法,通过创建DefaultListableBeanFactory实例完成容器的初始化。其中loadBeanDefinitions(加载bean配置文件)是个抽象方法,具体实现交给子类。

    2.2.2 AbstractRefreshableConfigApplicationContext抽象类

    是个抽象类,继承了父类AbstractRefreshableApplicationContext。这个类仅仅封装了configLocations对资源进行定位,具体操作都是子类中。

    2.2.3 AbstractXmlApplicationContext抽象类

    继承了AbstractRefreshableConfigApplicationContext。主要实现了loadBeanDefinitions对资源进行加载,内部使用XmlBeanDefinitionReader加载器。

    2.2.4 ClassPathXmlApplicationContext

    • AbstractXmlApplicationContext的子类,主要对类路径xml配置文件进行加载与初始化(refresh方法),是真正的容器实例。
    • 该类封装了configResources对资源进行定位,也可支持父类的configLocations,只负责配置资源路径,具体加载交给父类AbstractXmlApplicationContext操作,父类调用loadbeanDefinitions方法来加载资源,使用的是XmlBeanDefinitionReader加载器。

    ClassPathXmlApplicationContext类继承结构

    使用示例

    2.2.5 FileSystemXmlApplicationContext

    • AbstractXmlApplicationContext的子类,主要对文件路径xml配置文件进行加载与初始化,通过setConfigLocations对资源进行定位,调用refresh方法初始化容器,是真正的容器实例。
    • 和ClassPathXmlApplicationContext一样,只负责资源的定位,具体初始化过程交给父类来处理。

    FileSystemXmlApplicationContext类继承结构

    使用示例

    2.2.6 AbstractRefreshableWebApplicationContext抽象类

    • 是个抽象类,继承AbstractRefreshableConfigApplicationContext。
    • 实现了WebApplication接口,内置ServletContext,为容器添加了web特性。
    • 这里没有实现loadBeanDefinitions,是交给子类来做的。

    AbstractRefreshableWebApplicationContext继承结构

    2.2.7 AnnotationConfigWebApplicationContext

    • AbstractRefreshableWebApplicationContext子类实现。
    • web版本容器,接受带注释的类作为输入的实现,特别是@Configuration注解。
    • 通过register配置类或scan包扫描的方式加载bean,并重写了loadBeanDefinitions。

    AnnotationConfigWebApplicationContext类继承结构

    使用示例

    2.2.8 XmlWebApplicationContext

    • AbstractRefreshableWebApplicationContext子类实现,想要创建一个web容器可以继承AbstractRefreshableWebApplicationContext。
    • 为web应用准备,其中DispatcherServlet的父类FrameworkServlet用它作为默认容器,也可以不使用它。

    XmlWebApplicationContext类继承结构

    2.2.9 GroovyWebApplicationContext

    • AbstractRefreshableWebApplicationContext子类实现。
    • 支持Groovy语法的web容器,用于支持groovy bean配置文件。

    GroovyWebApplicationContext类继承结构

    2.3 Generic类容器

    2.3.1 GenericApplicationContext

    • AbstractApplicationContext的子类实现的通用容器,它能加载各种配置文件,例如xml,properties等,需要指定资源加载器。
    • 它的内部持有一个DefaultListableBeanFactory的实例,实现了BeanDefinitionRegistry接口,以便允许向其应用任何bean的定义的读取器。
    • 为了能够注册bean的定义,refresh()只允许调用一次。

    GenericApplicationContext类继承结构

    使用示例

    2.3.2 GenericXmlApplicationContext

    • GenericApplicationContext的子类。
    • 内置了对XML的支持,它非常的方便和灵活,是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext的一种替代品。
    • 它的内部有一个XmlBeanDefinitionReader的实例,专门用于处理XML的配置。

    GenericXmlApplicationContext类继承结构

    使用示例

    2.3.3 GenericWebApplicationContext

    • GenericApplicationContext的子类,实现了WebApplication接口,内置ServletContext,添加了web特性。

    GenericWebApplicationContext类继承结构

    2.3.4 GenericGroovyApplicationContext

    • 适用与Groovy环境,内置了GroovyBeanDefinitionReader资源加载器。

    GenericGroovyApplicationContext类继承结构

    2.3.5 AnnotationConfigApplicationContext

    • 独立的应用程序上下文,接受带注释的类作为输入,特别是带@Configuration注释的类。
    • 内置AnnotatedBeanDefinitionReader资源加载器和ClassPathBeanDefinitionScanner路径扫描器。
    • 通过register配置类或scan包扫描的方式加载bean。

    AnnotationConfigApplicationContext类继承结构

    使用示例

    2.3.6 StaticApplicationContext

    • ApplicationContext的实现,支持 bean 和消息的程序化注册,而不是从外部配置源读取 bean 定义,主要用于测试。

    StaticApplicationContext类继承结构

    参考资料:

    《Spring5核心原理与30个类手写》作者 谭勇德

    《Spring源码深度解析》作者 郝佳

    《Spring技术内幕》作者 计文柯



    本文来自博客园,作者:wzyy,转载请注明原文链接:https://www.cnblogs.com/wwzyy/p/15780560.html

  • 相关阅读:
    Seaslog高性能日志系统学习
    同步、异步与阻塞、非阻塞、协程
    SQL常用增删改查语句
    js里的document对象大全(DOM操作)
    php的cURL资源的初步使用
    hive学习笔记(初级)
    使用NSIS制作可执行程序的安装包
    C#设置一个控件可以鼠标拖动
    C#画图超出屏幕的部分无法显示的解决方法
    C#获取当前不同网卡对应的iP
  • 原文地址:https://www.cnblogs.com/wwzyy/p/15780560.html
Copyright © 2020-2023  润新知