上面第四节讲到了spring的DI/look up的数据来源,这次分析一下spring中的beanDefinition是怎么加载到beanFactory中的。

想一想我们在平时的工作中加载spring beanDefinition的几个来源

1:xml配置文件

2:properties文件

3:注解标注

那么针对三个不同的来源,会使用不同的手段加载到spring容器中。相当于spring设计一个接口,根据不同的规则实现特殊的类。

spring设计的接口就是BeanDefinitionReader

简单的看一下BeanDefinitionReader接口的方法

《spring设计思想》6 beanDefinition的加载实现

接口定义了loadBeanDefinitions方法,入参是Resource或者String,代表beanDefinitions配置资源,

具体的实现类:

《spring设计思想》6 beanDefinition的加载实现

具体有三个,GroovyBeanDefinitionReader / PropertiesBeanDefinitionReader /XmlBeanDefinitionReader。从名字上就能看出主要是解析什么养的BeanDefinitions的配置资源。一般环境中会用到PropertiesBeanDefinitionReader 和 XmlBeanDefinitionReader

但是没有看到解析注解的beanDefinitionReader;原因是,AnnotatedBeanDefinitionReader没有实现BeanDefinitionReader接口,因为AnnotatedBeanDefinitionReader没有必要解析Spring的Resource类型,只要扫描jar包的class文件就可以了。

所以Spring 中委托XmlBeanDefinitionReader/PropertiesBeanDefinitionReader/AnnotatedBeanDefinitionReader来解析beanDefintion,加载到spring容器中。其实这个容器很简单

接口名称BeanDefinitionRegistry

《spring设计思想》6 beanDefinition的加载实现

主要的方法就是registerBeanDefinition。

而Spring中的默认实现是DefaultListableBeanFactory

这个类非常的有意思因为在AbstractRefreshableApplication中包含了DefaultListableBeanFactory对象。

ClassPathXmlApplicationContext

XmlWebApplicationContext

AnnotationConfigWebApplicationContext都继承了该类。

 

相关文章:

  • 2021-06-06
  • 2022-01-14
  • 2021-09-16
  • 2021-09-07
  • 2021-05-14
  • 2021-11-12
  • 2021-04-18
猜你喜欢
  • 2021-05-28
  • 2021-08-21
  • 2022-12-23
  • 2022-02-09
  • 2022-12-23
  • 2021-12-22
  • 2021-04-26
相关资源
相似解决方案