BeanDefinition 存储了创建、配置和管理 Spring Bean 所需的所有元数据信息。以下是 BeanDefinition 中存储的主要信息和详细说明:
1. Bean 的基本信息:
-
beanClass(Class<?>): Bean 的类对象(例如,MyService.class)。- 通常情况下,这是 Bean 的实际类型。
- 如果 Bean 是通过工厂方法创建的,
beanClass可能是工厂类的类型。 - 可以通过
getBeanClassName()获取 Bean 的类名(字符串)。
-
scope(String): Bean 的作用域,决定了 Bean 的生命周期和可见性。singleton(默认): 单例,整个容器中只有一个 Bean 实例。prototype: 原型,每次请求 Bean 时都会创建一个新的实例。request: 请求作用域(Web 应用),每个 HTTP 请求都有一个 Bean 实例。session: 会话作用域(Web 应用),每个 HTTP 会话有一个 Bean 实例。application: 应用作用域(Web应用), 每个ServletContext有一个Bean 实例。globalSession: 全局会话作用域 (Portlet 应用)。- 自定义作用域:可以通过实现
Scope接口来创建自定义的作用域。
-
abstract(boolean): 是否是抽象 Bean。抽象 Bean 不能被实例化,通常用作模板。 -
lazyInit(boolean): 是否延迟初始化 Bean。false(默认): 容器启动时立即创建 Bean。true: 第一次请求 Bean 时才创建。- 可以被
@Lazy注解覆盖.
-
autowireMode(int): 自动装配模式,指定如何自动解析和注入 Bean 的依赖关系。AUTOWIRE_NO(0, 默认): 不自动装配。AUTOWIRE_BY_NAME(1): 根据 Bean 的名称自动装配。AUTOWIRE_BY_TYPE(2): 根据 Bean 的类型自动装配。AUTOWIRE_CONSTRUCTOR(3): 类似于byType,但应用于构造函数参数。AUTOWIRE_AUTODETECT(4): 已弃用.
-
dependencyCheck(int): 依赖检查模式 (已弃用,通常不使用)。 -
dependsOn(String[]): 该 Bean 所依赖的其他 Bean 的名称。Spring 会确保在创建该 Bean 之前先创建它所依赖的 Bean。 -
beanName: Bean 的名称, 在容器中唯一. -
primary: 是否是主要候选者. 当有多个Bean满足自动装配条件时, 优先选择主要的. -
initMethodName(String): Bean 的初始化方法名称。 -
destroyMethodName(String): Bean 的销毁方法名称。 -
factoryBeanName(String): 如果 Bean 是通过FactoryBean创建的,则指定FactoryBean的名称。可以通过&+ Bean 名称来引用FactoryBean本身。 -
factoryMethodName(String): 如果 Bean 是通过工厂方法创建的,则指定工厂方法的名称。
2. Bean 的构造函数参数:
constructorArgumentValues(ConstructorArgumentValues): 构造函数参数值。- 可以通过索引或类型指定参数。
- 可以是字面量值、对其他 Bean 的引用、集合等。
3. Bean 的属性值:
propertyValues(MutablePropertyValues): 属性值,用于 Setter 方法注入。- 可以是字面量值、对其他 Bean 的引用、集合等。
4. Bean 的依赖关系:
dependsOn(String[]): 显式指定的依赖关系。autowireCandidate(boolean): 指示该 Bean 是否可以作为自动装配的候选者(默认为true)。
5. Bean 的元数据:
-
description(String): Bean 的描述信息。 -
role(int): Bean 的角色提示。ROLE_APPLICATION(0, 默认): 应用的主要 Bean。ROLE_SUPPORT(1): 支持性的 Bean (例如,工具类)。ROLE_INFRASTRUCTURE(2): 基础设施 Bean (对应用不可见)。
-
source(Object): Bean 定义的来源(例如,XML 文件、配置类等)。 -
nonPublicAccessAllowed: 是否允许访问非 public 的构造方法和工厂方法. -
isSynthetic: 是否是合成的 Bean (由框架内部生成, 而不是用户定义的).
6. 方法覆盖 (Method Overrides):
methodOverrides(MethodOverrides): 用于方法注入(Method Injection),允许替换 Bean 中的方法实现。LookupOverride: 查找方法注入,用于获取原型 Bean 或不同作用域的 Bean。ReplaceOverride: 方法替换,用于替换方法的实现。
7. 其他:
resource(Resource): Bean 定义的来源资源(例如,XML 配置文件)。resolvedConstructorOrFactoryMethod: 解析后的构造方法或工厂方法.
访问 BeanDefinition 中的信息:
可以通过 BeanDefinition 接口提供的方法来访问这些信息,例如:
BeanDefinition beanDefinition = ...; // 获取 BeanDefinition 对象
String className = beanDefinition.getBeanClassName();
String scope = beanDefinition.getScope();
boolean isSingleton = beanDefinition.isSingleton();
boolean isLazyInit = beanDefinition.isLazyInit();
String[] dependsOn = beanDefinition.getDependsOn();
String initMethodName = beanDefinition.getInitMethodName();
String destroyMethodName = beanDefinition.getDestroyMethodName();
ConstructorArgumentValues constructorArgumentValues = beanDefinition.getConstructorArgumentValues();
MutablePropertyValues propertyValues = beanDefinition.getPropertyValues();
// ...
总结:
BeanDefinition 存储了关于 Spring Bean 的所有配置元数据,包括 Bean 的类、作用域、构造函数参数、属性值、依赖关系、初始化方法、销毁方法、是否懒加载、自动装配模式、名称、别名、是否抽象、是否单例、是否原型、是否主要候选者、方法覆盖等信息。 Spring 容器根据 BeanDefinition 中的信息来创建、配置和管理 Bean。

6万+

被折叠的 条评论
为什么被折叠?



