SpringBoot面试题04-BeanDefinition

一、什么是 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(对象)
相关推荐
倚肆8 小时前
Spring Boot CORS 配置详解:CorsConfigurationSource 全面指南
java·spring boot·后端
v***44678 小时前
springboot之集成Elasticsearch
spring boot·后端·elasticsearch
q***72198 小时前
Spring Boot(快速上手)
java·spring boot·后端
Swift社区8 小时前
StackOverflowError 栈溢出的原因与实战解决方案
java·spring boot·spring
p***97619 小时前
SpringBoot(7)-Swagger
java·spring boot·后端
j***29489 小时前
springboot集成onlyoffice(部署+开发)
java·spring boot·后端
张较瘦_9 小时前
Springboot | Spring Boot 3 纯 JDBC 实现宠物管理系统增删改查(无 ORM 框架)
spring boot·后端·数据库开发
h***673711 小时前
SpringBoot整合easy-es
spring boot·后端·elasticsearch