DefaultListableBeanFactory的层次结构
1.Spring的结构组成
1核心类介绍
1.DefaultListableBeanFactory
XmlBeanFactory继承自DefaultListableBeanFactory 而DefaultListableBeanFactory是整个bean加载的核心部分,是Spring注册及记载bean的默认实现,而对于XmlBeanFactory与DefaultListableBeanFactory 不同的地方其实是在XmlBeanFactory中使用了自定义的XML读取器 XMLBeanDefinitionReader,实现了个性化的BeanDefinitionReader读取,DefaultListableBeanFactory继承AbstractAutowireCapableBeanFactory 并实现了ConfigurableListableBeanFactory以及BeanDefinitionRegistry接口
AliasRegistry; 定义对alias的简单增删改查等操作
SimpleAliasRegistry: 主要使用map作为Alias的缓存,并对接口AliasRegistry进行实现。
SngletonBeanRegistry: 定义对单例的注册和获取
BeanFactory:定义获取bean及bean的各种属性,
DefaultSingletonBeanRegistry: 对接SingletonBeanRegistry各函数的实现。
HierarchicalBeanFactory:继承BeanFactory,也就是在BeanFactory定义的功能的基础上增加了对parentFatory的支持
BeanDefinitionRegistry:定义对BeanDefinition的各种增删改查操作
FactoryDeanRegistrySupport:在DefaultSingletonBeanRegistry基础上增加了对FactoryBean的特殊处理功能
ConfigurableBeanFactory:提供配置Factory的各种方法。
ListableBeanFactory: 根据各种条件获取bean的配置清单
AbstractBeanFactory: 综合FactoryDeanRegistrySupport和ConfigurableBeanFactory的功能
AutowireCapableBeanFactory: 提供创建bean,自动注入,初始化以及应用bean的后处理器
AbstractAutowireCapableBeanFactory:综合 AbstractBeanFactory并对接口 AutowireCapableBeanFactory进行实现
ConfigurableListableBeanFactory:BeanFatory配置清单,指定忽略类型及接口等
DefaultListableBeanFactory:综合上面所有的功能,主要对Bean注册后的处理
XmlBeanFactory对DefaultListableBeanFactory类进行了扩展,主要用于层XML文档中读取BeanDefinition 对于应用及获取Bean都是使用从父类XmlBeanDefinitionReader类型的reader属性,在XmlBeanFactory中主要使用reader属性对资源文件进行读取和注册
2.XmlBeanDefinitionReader
XML配置文件的读取是spring中重要的功能,因为Spring的大部分功能都是以配置作为切入点的,那么我们可以从XMlBeanDefinitionReader中梳理一下资源文件,解析及注册的大致脉络,首先我们看看各个类的功能。
ResourceLoader:定义资源加载器,主要应用于更久定义的资源文件地址返回对应的resource
BeanDefinitionReader: 主要定义资源文件读取并转换为BeanDefinition的各个功能
EnvironmentCapable:定义获取Environment方法。
DocumentKoader:定义从资源文件加载到转换为Document的功能
AbstractBeanDefinitionReader:对EnvironmentCapable,BeanDefinitionReader类定义的功能进行实现
BeanDefinitionDocumentReader:定义读取Docuemnt并注册BeanDefinition功能
BenaDefinitionParserDelegate: 定义解析Element的各种方法
经过以上分析,我们可以梳理出整个XML配置文件读取的大致流程,如下图所示,在XmlBeanDefinitionReader中主要包含一下几步的处理
1.通过继承自AbstractBeanDefinitionReader中的方法。类使用ResourLoader将资源文件路径转换为对应的resource文件
2.通过DocumentLoader对Resource文件进行转换,将Resource文件转换为Document文件
3.通过实现接口BeanDefinitionDocumentReader的DefauleBeanDefinitionDocumentReader类对Document进行解析,并使用BeanDefinitionParserDelegate对Element进行解析
2.容器的基础XmlBeanFactory
XmlBeanFactory bf = new XmlBeanFactory(new ClassPathResource("myTestBean.xml"));
在java中,将不同来源的资源抽象成URL,通过注册不同的handler 类处理不同来源的资源的读取逻辑,一般Handler的类型使用前缀来标识,然而URL没有默认定义相对Classpath或servletContext等资源的handler
1.配置文件封装
2.加载Bean
在XmlBeanFactory