Bean
– 框架留给使用者实现应用业务的概念
可以是任何POJO
类型,通常指运行时的某个对象。从使用者角度讲,被Spring
容器管理的对象通常都是Bean
,而且一个Bean
一般都来自某个Bean
定义。
Bean
一般应用于开发人员最关注的业务逻辑,Spring
框架对Bean
没有相应的接口建模,换句话讲,没有要求开发人员实现某个接口才能使一个POJO
成为Bean
,这正是Spring
的从一开始就存在的优点:尽量无侵入式地简化和支持Java
开发,而非强求或者添麻烦。
BeanDefinition
– Bean定义
开发人员或者框架自身对Bean
的定义的抽象建模。框架基于此定义和其他配置信息,比如AOP
配置,生成最终运行时使用的Bean
实例。Bean
定义可能来自某个开发人员或者框架的XML
配置或者注解,也可能由框架通过程序方式生成。Bean定义
会注册到BeanDefinitionRegistry
用于Bean
实例的创建。
Bean定义
其实是一个Spring
框架内部概念,用于抽象使用者(开发人员或者框架自身)对一个Bean
的定义,通常使用者不必太关心Bean定义
的实现原理,而是只需要按照Spring
建议的方式定义Bean
就可以了,如何发现和注册Bean
定义都是框架的工作。但是如果你想深度了解和学习Spring
框架的工作原理,建议理解此内部基础概念。
Bean定义
在框架内有对应的接口抽象,它就是BeanDefinition
,位于包org.springframework.beans.factory.config
。
ConfigurationClass
– 配置类
开发人员通过使用注解@Component
,@Configuration
定义的类,本身会作为一个Bean
注册到容器,这些类的主要目的是可以通过@Bean
注解的成员方法及其内置类定义更多的Bean
。
BeanFactory
– Bean工厂
,Bean容器
可以简单地将BeanFactory
理解成Bean
工厂,用于(根据Bean定义
)生产Bean
实例,也可以理解为Bean
容器,因为工厂所生产的Bean
(缺省情况下指单例Bean
)都会被该工厂保持一个引用清单。Spring
提供了多个BeanFactory
实现类,比如DefaultListableBeanFactory
。
BeanDefinitionRegistry
– Bean定义注册表
通常一个BeanFactory
实现类也可以实现BeanDefinitionRegistry
接口。简单点讲,Bean
容器即是Bean
定义容器又是Bean
实例容器,比如DefaultListableBeanFactory
。
ApplicationContext
– 应用上下文
对BeanFactory
的增强。通常可以理解为这是 : 一个BeanFactory
(用于管理Bean
定义和Bean
实例) + 文本信息解析功能 + 国际化/本地化支持 + 资源加载 + 环境信息管理 + 向注册为监听器的Bean
发送事件等扩展功能。
一些Spring
框架自己提供的实现类有如下等等:
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
AnnotationConfigServletWebServerApplicationContext
AnnotationConfigReactiveWebServerApplicationContext
AnnotationMetadata
– 注解元数据
Spring
对于某个类上的注解的抽象建模接口。也包含了类的每个方法的元数据和注解信息MethodMetadata
。可以这么简单的理解 :
AnnotationMetadata
= 类本身元数据 + 类上的注解信息 + Set(每个方法的元数据 + 注解信息)
这里面 :
- 类本身元数据的
Spring
抽象建模接口是ClassMetadata
。 - 方法的元数据 + 注解信息对应的
Spring
抽象建模接口是MethodMetadata
。
ClassMetadata
– 类元数据
Spring
对类本身元数据的抽象建模接口。类名称,是否是一个接口,是否是一个注解,是否为抽象类,是否实现类(concrete
),是否final
,是否被另外一个类包含(嵌套类的情况),super
类信息,所实现的接口的信息,内嵌类的信息。
MethodMetadata
– 方法元数据
Spring
对某个方法元数据的抽象建模接口。包含方法名称,方法所属声明类,返回类型,是否抽象方法,是否final
,是否静态函数,是否可以重载等方法基本信息。以及方法上的注解的信息。
InjectionMetadata
/InjectedElement
– 注入元数据/注入元素
Spring
内部对注入元数据的抽象建模,不用于应用开发。InjectionMetadata
表示针对某个bean
类的注入元数据,是若干个注入元素InjectedElement
的集合,每个注入元素InjectedElement
对应一个实例成员属性,方法或者构造函数。InjectionMetadata
/InjectedElement
被AutowiredAnnotationBeanPostProcessor
/CommonAnnotationBeanPostProcessor
/PersistenceAnnotationBeanPostProcessor
用于搜集bean
定义上的注入元数据和完成注入。