zoukankan      html  css  js  c++  java
  • Spring源码学习笔记(二、Spring容器核心类)

    目录:

    • 前言
    • BeanFactory
    • ApplicationContext
    • BeanDefinition
    • XMLBeanDefinitionReader

    前言

    使用Spring时,XML注解是两种使用得最多的配置方式,虽然是两种完全不同的配置方式,但对于IOC容器来说,两种方式的不同主要体现在BeanDefinition的解析上

    BeanFactory

    BeanFactory为Spring的IOC器提供了基础功能

    它主要被用于与Spring其他部分以及相关的第三方框架集成,并且它的子类实现DefaultListableBeanFactory是更高级别的GenericApplicationContext容器中的关键委托。

    关系图:

    图中类作用如下(顺序,上到下左到右):

    • AliasRegistry:定义别名的简单操作(如增删查等)。
    • -------------------------------------------
    • BeanFactory:定义获取bean及其各种属性
    • SingletonBeanRegistry:定义单例bean注册获取
    • SimpleAliasRegistry:对AliasRegistry的简单实现,基于ConcurrentHashMap
    • BeanDefinitionRegistry:向注册表中注册BeanDefinition实例,完成注册。
    • -------------------------------------------
    • ListableBeanFactory:提供多种获取bean定义的方式。
    • HierarchicalBeanFactory:在BeanFactory的基础上增加了对parent BeanFactory的支持
    • DefaultSingletonBeanRegistry:对SingletonBeanRegistry接口的实现。
    • -------------------------------------------
    • ConfigurableBeanFactory:定义配置factory的方法。
    • FactoryBeanRegistrySupport:在DefaultSingletonBeanRegistry的基础上增加了对FactoryBean的处理功能
    • -------------------------------------------
    • AutowireCapableBeanFactory:提供创建Bean、自动注入,初始化以及应用Bean的后处理器
    • AbstractBeanFactory:实现FactoryBeanRegistrySupport、ConfigurableBeanFactory功能的集合。
    • -------------------------------------------
    • ConfigurableListableBeanFactory:BeanFactory配置清单,指定忽略类型及接口等。
    • AbstractAutowireCapableBeanFactory:综合AbstractBeanFactory对接口AutowireCapableBeanFactory进行实现
    • -------------------------------------------
    • DefaultListableBeanFactory:综合上面所有的功能。

    ApplicationContext

    ApplicationContext接口是由BeanFactory接口派生出来的,所以提供了BeanFactory的所有功能

    除此之外,ApplicationContext还扩展了如下功能:

    • 通过MessageSource访问i18n(国际化)消息。
    • 通过ResourceLoader访问资源,如:URL和文件。
    • 使用ApplicationEventPublisher接口,将事件发布到实现ApplicationListener接口的Bean。
    • 加载多个(分层)上下文,从而允许每个上下文通过HierarchicalBeanFactory接口集中在一个特定层上。

    BeanFactory和ApplicationContext区别:

    关系图:

    BeanDefinition

    我们知道Spring IOC容器可以管理一个或多个Bean,而这些Bean是根据程序提供给容器的配置元数据创建的,如:以XML的<bean />格式。

    BeanDefinition实际上就是Bean在Spring容器内部的表示形式,也就是一个将Bean解析成Spring内部的BeanDefinition对象的过程

    BeanDefinition包含以下元数据信息:

    • 一个全限定的类名。
    • 用于声明Bean在容器中的行为信息(作用域,生命周期回调等)。
    • 要完成自身工作需要引用其他的Bean,这些引用也称为依赖项
    • 要在新创建的对象中设置的其他配置,如:用于管理连接池的连接数,或池的大小限制

    这些元数据构成每个BeanDefinition的一组属性

    • class。
    • name:Bean在容器内的唯一标识符。基于XML的配置,可以使用id或name属来指定Bean标识符。
    • scope:Bean的作用域
    • constructor arguments:构造函数的参数。
    • properties:Bean包含的属性(依赖注入项)。
    • autowiring mode:自动装配模式
    • lazy-initialization mode:延迟加载方法
    • initialization method:初始化方法
    • destruction method:销毁方法

    BeanDefinition继承了AttributeAccessor、BeanMetadataElement接口:

    • AttributeAccessor:提供访问属性的能力。
    • BeanMetadataElement:用于获取元数据元素配制源对象

    BeanDefinition常见实现类:

    • ChildBeanDefinition
    • RootBeanDefinition
    • GenericBeanDefinition
    • AnnotatedGenericBeanDefinition
    • ScannedGenericBeanDefinition

    XmlBeanDefinitionReader

    XML配置文件的读取是Spring的重要功能,因为Spring的大部分功能都是以配置作为切入点的

    • BeanDefinitionReader:主要定义资源文件读取转换为BeanDefinition的各个功能
    • EnvironmentCapable:定义获取Environment方法
    • DocumentLoader:定义从资源文件加载到转换为Document的功能
    • AbstractBeanDefinitionReader:对EnvironmentCapable、BeanDefinitionReader类定义的功能进行实现
    • BeanDefinitionDocumentReader:定义读取Document注册BeanDefiniton功能。
    • BeanDefinitionParserDelegate:定义解析Element的各种方法。

    关系图:

    在XmlBeanDifinitonReader中主要包含以下几个步骤的处理:

    • 通过继承自AbstractBeanDefinitionReader中的方法,来使用ResourceLoader将资源文件路径转换为对应的Resource文件。
    • 通过DocumentLoader对Resource文件进行转换,将Resource文件转换为Document文件。
    • 通过实现接口BeanDefinitionDocumentReader的DefaultBeanDefinitionDocumentReader类对Document进行解析,并使用BeanDefinitionParserDelegate对Element进行解析。
  • 相关阅读:
    375D.Tree and Queries(树上启发式合并+离线)
    600E.Lomsat gelral (树上启发式合并)
    741D.Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(树上启发式合并+状压)
    Nowcoder13249.黑白树(树形DP)
    Nowcoder51179.选课(树形背包)
    Nowcoder20811.蓝魔法师(树形背包)
    Nowcoder19782.Tree(树形DP+逆元)
    Gym102292M.Monster Hunter(树形背包+滚动数组)
    大数据运维(61)Linux环境安装PostgreSQL-10.1
    大数据运维(60)Hive on Spark配置
  • 原文地址:https://www.cnblogs.com/bzfsdr/p/12839612.html
Copyright © 2011-2022 走看看