一、什么是 BeanDefinition?
BeanDefinition 是 Spring 用来"描述一个 Bean 的信息的对象"。
换句话说:
BeanDefinition = Bean 的"说明书 / 菜谱 / 配置单"。
它不是 Bean 本身,而是:
-
记录着这个 Bean 是什么
-
要 怎么创建
-
要 怎么注入依赖
-
生命周期怎么管理
二、BeanDefinition 记录了什么?
以下信息全部保存在 BeanDefinition 里:
| 信息 | 示例 | 作用 |
|---|---|---|
| Bean的类型 | UserService.class |
要 new 谁 |
| 构造参数 | new UserService(orderService) |
创建时需要谁 |
| 作用域 | singleton / prototype |
单例还是每次 new |
| 是否懒加载 | lazy-init |
是否启动时就创建 |
| 是否需要自动注入 | @Autowired |
DI 自动注入依赖 |
| 是否有 AOP 代理 | 动态代理信息 | 创建 Bean 时包装代理 |
| 初始化方法 | afterPropertiesSet() |
Bean 初始化回调 |
一句话:BeanDefinition 记录了"怎么创建 Bean"。
2-1、常用方法

2-2、继承关系

测试:



三、BeanDefinition 的地位
Spring 创建 Bean 的流程是:
① 扫描类路径
② 解析注解(@Component、@Service、@Bean 等)
③ 生成 BeanDefinition(记录 Bean 配置信息)
④ 把 BeanDefinition 缓存到 BeanFactory
⑤ 在需要时根据 BeanDefinition 实例化 Bean
也就是:
先保存定义 → 再按定义创建
所以 BeanDefinition 是 Spring IoC 的基础 。
3-1、直观流程图
ClassPath + 注解扫描
↓
BeanDefinition(记录信息)
↓ 放进
DefaultListableBeanFactory(Bean 工厂)
↓ 按说明书创建
实例化 Bean(new 对象 + 注入依赖 + AOP)
BeanDefinition 是连接"类 → Bean"的桥梁。
3-2、为什么不直接 new?还要 BeanDefinition 干啥?
因为 Spring 要实现:
| 功能 | 为什么需要 BeanDefinition |
|---|---|
| 自动装配 | 需要提前解析依赖关系 |
| AOP 代理 | 需要决定是否要增强 Bean |
| 循环依赖处理 | 需要提前知道谁依赖谁 |
| 作用域管理 | 需要知道是否多例 or 单例 |
| 懒加载 | 需要记录什么时候创建 Bean |
如果直接 new,将无法实现这些强大特性。
所以:
BeanDefinition = Spring 能够比"直接 new"更强大的关键所在。
四、总结
BeanDefinition = Bean 的说明书
Spring 先读取说明书(BeanDefinition)
再根据说明书创建 Bean(对象)