Spring的爬坑之路(三)DefaultlistableBeanFactory
DefaultlistableBeanFactory是bean加载的核心部分,是spring注册和加载bean的默认实现方式。 而继承自 DefaultListableBeanFactoryd的XmlBeanFactory使用了自定义的 XML 读取器 XmlBeanDefinitionReader,实现了个性化的BeanDefinitionReader读取。
DefaultListableBeanFactory
DefaultListableBeanFactory 继承了 AbstractAutowireCapableBeanFactory 并实现了 ConfigurableListableBeanFacto可以 及 BeanDefinitionRegistry 接口。下面我们简单看一下相关类:
简单的梳理下各类的作用:
- AliasRegistrγ: 定义对 alias 的简单增删改等操作。
- SimpleAliasRegistry: 主要使用 map 作为 alias 的缓存,并对接口 AliasRegistry 进行 实现。
- SingletonBeanRegistry:定义对羊例的注册及获取 。
- BeanFactory:定义 获取 bean 及 bean 的各种属性 。
- DefauItSingletonBeanRegistry:对接口 SingletonBeanRegistry各函数的实现。
- HierarchicalBeanFactory:继承 BeanFactory,也就是在 BeanFactory 定义的功能的基础 上增加了对 parentFactory 的 支持 。
- BeanDefinitionRegistry: 定义对 BeanDefinition 的各种增删改操作
- FactoryBeanRegistrySupport:在 DefaultSingletonBeanRegistry 基础上增加了对 FactoryBean 的特殊处理功能 。
- ConfigurableBeanFactory: 提供配直 Factory 的各种方法 。
- ListableBeanFactory: 根据各种条件获取 bean 的配直清单 。
- AbstractBeanFactory: 综合 FactoryBeanRegistrySupport 和 ConfigurableBeanFactory 的 功能。
- AutowireCapableBeanFactory: 提供创 建 bean、自动注入、初始化以及应用 bean 的后 处理器 。
- AbstractAutowireCapableBeanFactory: 综合 AbstractBeanFactory 并对接口 Autowire、 Capable、 BeanFactory进行实现。
- ConfigurableListableBeanFactory: Beanfactory配直清单,指定忽略类型及接口等。
- DefaultListableBeanFactory: 综合上面所有功能, 主要是对 bean 注册后的处理 。
XmlBeanFactory
XmlBeanFactory对 DefaultListableBeanFactorγ类进行了扩展,主要用于从 XML 文档中读 取 BeanDefinition,对于注册及获取 bean 都是使用从父类 DefaultListableBeanFactory 继承的方 法去实现,而唯独与父类不同的个性化实现就是增加了 XmlBeanDefinitionReader类型的 reader 属性。 在 XmlBeanFactory 中主要使用 reader属性对资源文件进行读取和注册。
/**
* Create a new XmlBeanFactory with the given input stream,
* which must be parsable using DOM.
* @param resource the XML resource to load bean definitions from
* @param parentBeanFactory parent bean factory
* @throws BeansException in case of loading or parsing errors
*/
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource); // 个性化实现
}
XmlBeanDefinitionReader
XML 配置文件的读取是 Spring 中重要的功能 ,因为 Spring 的大部分功能都是以配置作为切入点的,那么我们可以从 XmlBeanDefinitionReader中梳理一下资源文件读取、解析及注册的大致脉络,首先我们看看各个类的功能 。
- ResourceLoader: 定义资源加载器,主要应用于根据给定的资源文件地址返回对应的 Resource。
- BeanDefinitionReader: 主要定义资源文件读取并转换为 BeanDefinition 的各个功能 。
- EnvironmentCapable: 定义获取 Environment 方法 。
- DocumentLoader: 定义从资源、文件加载到转换为 Document 的功能 。
- AbstractBeanDefinitionReader:对 EnvironmentCapable、 BeanDefinitionReader 类定义的功能进行实现 。
- BeanDefinitionDocumentReader :定义读取 Docuemnt 并注册 BeanDefinition 功能
- BeanDefinitionParserDelegate:定义解析 Element 的各种方法 。
下面我们简单梳理下配置文件读取相关类图:
1、通过继承向 AbstractBeanDefinitionReader中的方法,来使用 ResourLoader将资源文件 路径转换为对应的 Resource文件。
2、通过 DocumentLoader 对 Resource 文件进行转换,将 Resource 文件转换为 Document 文件。
3、通过实现接口 BeanDefinitionDocumentReader 的 DefaultBeanDefinitionDocumentReader类
对 Document进行解析,并使用 BeanDefinitionParserDelegate对 Element进行解析。
测试方法
上边的关系我们大致梳理,对此有了一定的了解,那么如何直观的去感受其中的调用关系呢,还是老办法,debug跟代码。那么为大家附上测试方法:
public static void main(String[] args) {
BeanFactory bf = new XmlBeanFactory(new ClassPathResource("Spring.xml"));
System.out.println(bf);
}
下面为大家附上XmlBeanFactory初始化时序图:
时序图从 BeanFactoryTest测试类开始,通过时序图我们可以一 目了然地看到整个逻辑处理顺序。在测试的 BeanFactoryTest 中首先调用 ClassPathResource 的构造函数来构造 Resource 资源文件的实例对象,这样后续的资源处理就可以用 Resource提供的各种服务来操作了,当 我们有了 Resource 后就可以进行 XmlBeanFactory 的初始化了 。