一、先给你一句“总定义”(非常重要)
BeanDefinition 是 Spring 用来“描述 Bean 的元数据模型”,不是 Bean 本身,而是“如何创建 Bean 的说明书”。
📌 Spring IOC 的本质就是:
BeanDefinition + BeanFactory = Bean
二、BeanDefinition 在 Spring 中的地位(核心)
Spring IOC 容器做的所有事,本质只有三步:
1️⃣ 读取 / 构建 BeanDefinition 2️⃣ 注册 BeanDefinition 到容器 3️⃣ 根据 BeanDefinition 创建 Bean
所以你看到的:
XML
@Component
@Bean
动态注册 Bean
自动装配
👉最终都会被统一转换成 BeanDefinition
三、BeanDefinition 是“描述什么”的?(内容全览)
1️⃣ Bean 的基本信息
| 属性 | 说明 |
|---|---|
| beanClassName | Bean 的类名 |
| beanClass | Class 对象(解析后) |
| scope | singleton / prototype |
| lazyInit | 是否懒加载 |
| abstract | 是否抽象 |
| factoryBeanName | 工厂 Bean 名 |
| factoryMethodName | 工厂方法 |
2️⃣ 构造相关信息
| 属性 | 说明 |
|---|---|
| constructorArgumentValues | 构造方法参数 |
| resolvedConstructorOrFactoryMethod | 解析后的构造方法 |
| autowireMode | 构造 / byType / byName |
3️⃣ 属性注入信息
| 属性 | 说明 |
|---|---|
| propertyValues | setter 注入 |
| dependsOn | 依赖的 Bean |
| autowireCandidate | 是否参与自动注入 |
| primary | 是否主 Bean |
4️⃣ 生命周期方法
| 属性 | 说明 |
|---|---|
| initMethodName | 初始化方法 |
| destroyMethodName | 销毁方法 |
| enforceInitMethod | 是否强制调用 |
| enforceDestroyMethod | 是否强制调用 |
5️⃣ 注解 & 条件信息
| 内容 | 来源 |
|---|---|
| @Lazy | lazyInit |
| @DependsOn | dependsOn |
| @Primary | primary |
| @Role | role |
| @Conditional | condition |
| @Profile | profile |
四、BeanDefinition 的继承体系(非常重要)
BeanDefinition (接口) | ├── AbstractBeanDefinition | | | ├── RootBeanDefinition | ├── ChildBeanDefinition | ├── GenericBeanDefinition | ├── AnnotatedBeanDefinition
1️⃣ BeanDefinition(接口)
最顶层抽象,只定义规范。
2️⃣ AbstractBeanDefinition(核心实现)
99% 的属性都在这里
scope
lazyInit
autowire
initMethod
destroyMethod
constructor args
property values
📌Spring 内部几乎全操作它
3️⃣ RootBeanDefinition(最终形态)
真正用来创建 Bean 的定义
父子合并后的结果
Spring 创建 Bean 前生成
会被缓存(非常重要)
📌你几乎不直接 new 它
4️⃣ GenericBeanDefinition(通用定义)
最“干净”、最常用的注册形态
没有 parent
非 merged
适合动态注册 Bean
你现在用的BeanDefinitionBuilder
👉 内部就是GenericBeanDefinition
5️⃣ AnnotatedBeanDefinition(注解 Bean)
用于:
@Component
@Configuration
@Bean
额外包含:
AnnotationMetadata MethodMetadata
五、BeanDefinition 的“生命周期”(非常关键)
1️⃣ 解析(XML / 注解 / API) 2️⃣ 构建 Raw BeanDefinition 3️⃣ 注册到 BeanFactory 4️⃣ 合并成 RootBeanDefinition 5️⃣ 创建 Bean 实例 6️⃣ 执行 BeanPostProcessor
📌你现在操作的是第 2~3 步
六、Raw / Merged BeanDefinition(再巩固一次)
| 阶段 | 类型 |
|---|---|
| 注册前 | Raw BeanDefinition |
| getMergedBeanDefinition | RootBeanDefinition |
| Bean 创建 | RootBeanDefinition |
你用的:
getRawBeanDefinition()
✔ 正确
✔ 安全
✔ 官方推荐做法
七、BeanDefinition 和 BeanFactory 的关系
BeanFactory 是“仓库”,BeanDefinition 是“商品说明书”
DefaultListableBeanFactory ├── Map<String, BeanDefinition> beanDefinitionMap ├── Map<String, Object> singletonObjects └── Map<String, RootBeanDefinition> mergedBeanDefinitions
八、BeanDefinition 的“高级能力”
1️⃣ BeanDefinition + Supplier(你正在用)
genericBeanDefinition(clazz, () -> instance)
✔ 绕过反射
✔ 直接返回对象
✔ 常用于动态 Bean / SDK / Client
2️⃣ FactoryBean vs BeanDefinition
| 对比 | FactoryBean | BeanDefinition |
|---|---|---|
| 定义层 | 运行期 | 配置期 |
| 作用 | 生产 Bean | 描述 Bean |
| 使用场景 | 复杂构造 | 元数据描述 |
3️⃣ 动态修改 BeanDefinition
你现在的代码就是典型用法:
注册
移除
覆盖
替换
📌 Spring Boot 自动装配大量使用这套机制
九、和 BeanDefinition 强相关的“核心扩展点”
| 扩展点 | 操作对象 |
|---|---|
| BeanDefinitionRegistryPostProcessor | BeanDefinition |
| BeanFactoryPostProcessor | BeanDefinition |
| BeanPostProcessor | Bean 实例 |
| InstantiationAwareBeanPostProcessor | 构造阶段 |
📌BeanDefinition 是所有扩展的起点
十、面试 / 架构一句话总结(直接用)
Spring IOC 的核心不是 Bean,而是 BeanDefinition。所有配置方式最终都会转化为 BeanDefinition,Spring 在创建 Bean 前会对 BeanDefinition 做合并、解析、增强,最终用 RootBeanDefinition 创建 Bean 实例。