面试记录 2026-10-11
题目:Spring 中注入 Bean 有几种方式
难度:medium
标签:spring/di, difficulty/medium
评分:⭐⭐⭐☆☆(3/5)
我的回答
Spring 中注入变量方式,核心应该有 3 种。首先是构造器注入,其次是属性注入,然后是属性 set、参数 set 的注入。理论上应该都使用构造器注入才更安全稳健,但是更多的其实是使用属性注入,直接在参数上做注入,连 set 的注入都很少用。参数注入的注入方式相对构造器跟 set 来说更简洁。
点评
优点:
- 核心 3 种注入方式说对了:构造器注入、属性注入(@Autowired 字段)、setter 注入
- 提到了构造器注入更安全可靠(不可变对象)
- 提到了实际开发中 @Autowired 字段注入更常用
不足:
- 漏掉了 @Value 注解注入(从配置文件/环境变量注入)
- 漏掉了 @Qualifier 注解(当多个同类型 Bean 时指定注入哪个)
- 漏掉了构造器注入的最佳实践(只有一个构造器时 @Autowired 可省略)
- 术语混乱:"属性注入"和"setter 注入"应该是两个不同的概念
补充:
- Spring 4.3+ 推荐构造器注入,如果一个类只有一个构造器,@Autowired 可以省略
- @Value 注解用于注入配置文件中的值(如
${config.property})
- @Qualifier 用于指定注入哪个同类型的 Bean(如
@Qualifier("dataSource"))
- setter 注入适合可选依赖,构造器注入适合必需依赖
完整讲解
第一部分:知识重点剖析
核心考点定位:考察 Spring IoC 容器的依赖注入机制,理解不同注入方式的优缺点和适用场景。
知识点拆解:
- 构造器注入:
- 通过构造函数参数注入依赖
- 优点:不可变对象、必需依赖、单元测试友好
- 缺点:构造函数参数多时不优雅
- Spring 4.3+ 推荐,只有一个构造器时 @Autowired 可省略
- setter 注入:
- 通过 setter 方法注入依赖
- 优点:可选依赖、可重新注入
- 缺点:不可变对象、单元测试不友好
- 适合可选依赖场景
- 字段注入(@Autowired 字段):
- 直接在字段上标注 @Autowired
- 优点:代码简洁
- 缺点:不可测试、依赖 Spring 容器
- 实际开发中最常用,但不推荐
- @Value 注解注入:
- 从配置文件/环境变量注入值
- 格式:
@Value("${config.property}")
- @Qualifier 注解:
- 当有多个同类型 Bean 时,指定注入哪个
- 格式:
@Qualifier("beanName")
第二部分:考察方向与延伸递进
考察方向:
- 深度:理解不同注入方式的底层机制和优缺点
- 广度:关联 IoC 容器、Bean 生命周期、Spring 配置
- 应用:能根据场景选择合适的注入方式
延伸递进面试题:
- 构造器注入和 setter 注入怎么选?
- 解答要点:必需依赖用构造器注入,可选依赖用 setter 注入
- 字段注入为什么被 Spring 官方不推荐?
- 解答要点:不可测试、依赖 Spring 容器、无法保证不可变性
- @Value 和 @Autowired 有什么区别?
- 解答要点:@Autowired 注入 Bean,@Value 注入值(从配置文件)
第三部分:面试者参考回答(三步法口语化,300-400 字)
【一句话结论】
面试官您好,Spring 中注入 Bean 主要有 3 种方式:构造器注入、setter 注入、字段注入,Spring 4.3+ 推荐构造器注入。
【三点展开】
第一,构造器注入通过构造函数参数注入,优点是创建不可变对象、必需依赖、单元测试友好,Spring 4.3+ 如果一个类只有一个构造器,@Autowired 可以省略。
第二,setter 注入通过 setter 方法注入,适合可选依赖、可重新注入的场景,但不适合创建不可变对象。
第三,字段注入直接在字段上标注 @Autowired,代码最简洁,实际开发中最常用,但 Spring 官方不推荐,因为不可测试、依赖 Spring 容器。
【一句边界】
当然,除了这 3 种,还有 @Value 注解从配置文件注入值,@Qualifier 注解指定同类型 Bean 中的哪一个,实际开发中需要根据场景灵活选择。