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:综合上面所有的功能。
ListableBeanFactory:ApplicationContext 继承了 ListableBeanFactory,这个 Listable 的意思就是,通过这个接口,我们可以获取多个 Bean,大家看源码会发现,最顶层 BeanFactory 接口的方法都是获取单个 Bean 的。
HierarchicalBeanFactory:ApplicationContext 继承了 HierarchicalBeanFactory,Hierarchical 单词本身已经能说明问题了,也就是说我们可以在应用中起多个 BeanFactory,然后可以将各个 BeanFactory 设置为父子关系。
AutowireCapableBeanFactory:这个名字中的 Autowire 大家都非常熟悉,它就是用来自动装配 Bean 用的,但是仔细看上图,ApplicationContext 并没有继承它,不过不用担心,不使用继承,不代表不可以使用组合,如果你看到 ApplicationContext 接口定义中的最后一个方法 getAutowireCapableBeanFactory() 就知道了。
ConfigurableListableBeanFactory:也是一个特殊的接口,看图,特殊之处在于它继承了第二层所有的三个接口,而 ApplicationContext 没有。这点之后会用到。
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进行解析。