-
BeanFactory为Spring的IoC容器提供了基础功能。它主要被用于与Spring其他部分以及相关的第三方框架集成,并且它的子类实现DefaultListableBeanFactory是更高级别的GenericApplicationContext容器中的关键委托。
Spring Bean的创建是典型的工厂模式,这一系列的Bean工厂(即IoC容器)为开发者管理对象的依赖关系提供了很多便利,在Spring中有许多的IoC容器实现供用户选择和使用,其相互关系如下:
DefaultListableBeanFactory是Bean加载的最核心部分,也是Spring注册及管理加载Bean的默认实现。DefaultListableBeanFactory继承自AbstractAutowireCapableBeanFactory并实现了ConfigurableListableBeanFactory以及BeanDefinitionRegistry接口。下面是DefaultListableBeanFactory继承关系图:
类图中的类作用描述如下:
AliasRegistry
定义对alias的简单增删改查等操作
BeanDefinitionRegistry
向注册表中注册 BeanDefinition 实例,完成注册程
SimpleAliasRegistry
主要使用map作为alias的缓存,并对接口AliasRegistry进行实现
SingletonBeanRegistry
定义对单例的注册及获取
BeanFactory
定义获取Bean及各种属性
DefaultSingletonBeanRegistry
对接口SingletonBeanRegistry各函数的实现
ListableBeanFactory
根据各种条件获取Bean的列表
HierarchicalBeanFactory
继承BeanFactory,也就是在BeanFactory定义的功能的基础上增加了对parent BeanFactory的支持
FactoryBeanRegistrySupport
在DefaultSingletonBeanRegistry的基础上增加了对FactoryBean的处理功能
ConfigurableBeanFactory
提供配置Factory的各种方法
AutowireCapableBeanFactory
提供创建Bean、自动注入,初始化以及应用Bean的后处理器
AbstractBeanFactory
FactoryBeanRegistrySupport和ConfigurableBeanFactory功能的集合
AbstractAutowireCapableBeanFactory
综合AbstractBeanFactory并对接口AutowireCapableBeanFactory进行实现
ConfigurableListableBeanFactory
BeanFactory配置清单,指定忽略类型及接口等
DefaultListableBeanFactory
综合上面所有的功能
2.ApplicationContext接口是由BeanFactory接口派生出来的,所以提供了BeanFactory的所有功能。除此之外,ApplicationContext还提供了如下功能:
2.1通过MessageSource访问i18n消息。
2.2通过ResourceLoader访问资源,如:URL和文件。
2.3使用ApplicationEventPublisher接口,将事件发布到实现ApplicationListener接口的Bean。
2.4加载多个(分层)上下文,从而允许每个上下文通过HierarchicalBeanFactory接口集中在一个特定层上。如:Web层。
BeanFactory和ApplicationContext
BeanFactory的核心概念就是Bean工厂,用于Bean生命周期的管理,而Applicationcontext除了具有BeanFactory的特性外,还包括消息国际化、资源访问、事件传播等功能。简而言之,BeanFactory提供了配置框架和基本功能,而ApplicationContext则添加了更多特定的功能。ApplicationContext是BeanFactory的完整超集。
除非您有充分的理由,否则请使用ApplicationContext。因为ApplicationContext包含BeanFactory的所有功能,除非你需要完全控制Bean处理的方案。
特点
BeanFactory
ApplicationContext
Bean实例化/装配
Yes
Yes
集成的生命周期管理
No
Yes
自动注册 BeanPostProcessor
No
Yes
自动注册BeanFactoryPostProcessor
No
Yes
便利的 MessageSource访问
No
Yes
内置的ApplicationEvent发布机制
No
Yes
3.BeanDefinition
Spring IoC容器管理一个或多个Bean。这些Bean是根据程序提供给容器的配置元数据创建的,如:以XML <bean />格式的定义。而在容器内部,这些Bean需要表示为BeanDefinition对象,也就是有一个将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
4.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进行解析。
Spring容器核心类
于 2022-07-28 16:17:21 首次发布