DefaultlistableBeanFactory是bean加载的核心部分,是spring注册和加载bean的默认实现方式。 而继承自 DefaultListableBeanFactoryd的XmlBeanFactory使用了自定义的 XML 读取器 XmlBeanDefinitionReader,实现了个性化的BeanDefinitionReader读取。
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对 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); // 个性化实现 }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 的初始化了 。
