Spring源码之BeanFactory和BeanDefinition
BeanFactory和BeanDefinition
BeanFactory
BeanFactory是Spring提供给外部访问容器的根接口,接口中包含了getBean等常见的方法;经常使用到的ApplicationContext就实现了BeanFactory接口。
BeanFactory的主要实现类如下:
- DefaultListableBeanFactory是最常用的 BeanFactory 实现之一,它是一个可列表的(listable)、可修改的(modifiable)Bean 工厂实现,支持 bean 的按名称查询、类型查询以及通过别名查询。它还支持 bean 定义的动态注册和修改。此实现类通常与 BeanDefinitionReader 配合使用,可以从 XML、注解或其他配置来源加载 Bean 定义
ApplicationContext主要实现类如下:
-
ClassPathXmlApplicationContext
- ClassPathXmlApplicationContext用于从类路径(classpath)中的XML配置文件加载上下文定义。适合那些配置文件位于类路径下的应用,它在启动时会读取指定的XML文件并初始化 Spring 容器
-
FileSystemXmlApplicationContext
- 从文件系统中的任何位置加载 XML 配置文件,需要提供文件系统的绝对路径
-
AnnotationConfigApplicationContext
- 用于通过注解配置的 Spring 应用程序。它不需要 XML 配置文件,而是通过扫描带有 @Configuration 和 @Component 等注解的类来发现和注册 Bean
-
AnnotationConfigWebApplicationContext
- 特定于 web 应用的上下文,它继承自 GenericApplicationContext 并提供了 web 应用特有的功能,如与 Servlet 上下文的集成。适用于基于注解的 Spring MVC 应用
- 除了AnnotationConfigWebApplicationContext,还存在一个类似的XmlWebApplicationContext,也是用于Web环境的
-
GenericApplicationContext
- GenericApplicationContext 不是一个直接用于生产环境的实现,但它提供了一个基础的上下文实现,可以被其他上下文实现类扩展。它不直接关联任何特定的配置机制,通常与其他 BeanDefinitionReader 一起使用来加载配置
我们在启动Spring Web应用时会使用WebContext去启动容器,创建Bean对象。非Web应用根据使用是注解还是配置文件去决定使用哪种类型的Context。
BeanDefinition
BeanDefinition中文翻译过来就是Bean定义,Spring会根据BeanDefinition去创建Bean,而BeanDefinition则在Spring容器启动的时候从配置文件或者根据注解去解析得到。
BeaDefinition继承了AttributeAccessor接口和BeanMetadataElement接口。
- AttributeAccessor接口提供了对BeanDefinition属性操作的能力
- BeanMetadataElement接口则可以返回Bean的来源
Spring提供了BeanDefinitionRegistry去操作BeanDefinition,BeanDefinitionRegistry接口具有增、删、查(这里的增删查指的是对存放BeanDefinition的集合进行操作)BeanDefinition的能力。
Spring同时也提供了一个BeanDefinitionReader接口,这个接口是用于从xml配置文件或者java配置文件中读取BeanDefinition的。
BeanDefi