Spring的爬坑之路(三)DefaultlistableBeanFactory

Spring的爬坑之路(三)DefaultlistableBeanFactory

  • DefaultListableBeanFactory
  • XmlBeanFactory
  • XmlBeanDefinitionReader
  • 测试方法

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 的各种方法 。

下面我们简单梳理下配置文件读取相关类图:
Spring的爬坑之路(三)DefaultlistableBeanFactory_第1张图片

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初始化时序图:
Spring的爬坑之路(三)DefaultlistableBeanFactory_第2张图片

时序图从 BeanFactoryTest测试类开始,通过时序图我们可以一 目了然地看到整个逻辑处理顺序。在测试的 BeanFactoryTest 中首先调用 ClassPathResource 的构造函数来构造 Resource 资源文件的实例对象,这样后续的资源处理就可以用 Resource提供的各种服务来操作了,当 我们有了 Resource 后就可以进行 XmlBeanFactory 的初始化了 。

你可能感兴趣的:(Spring)