Spring BeanDefinition 它存储了哪些信息?

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.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值