news 2026/8/7 4:52:35

Spring Boot依赖注入方式比较

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot依赖注入方式比较

主要区别

写法1:字段注入(Field Injection)

java

@Autowired private PrintTemplateService templateService;
  • 特点:Spring 自动注入依赖到字段

  • 问题

    • 违反了单一职责原则(类可以有太多依赖)

    • 不便于单元测试(必须通过反射设置私有字段)

    • 可能导致循环依赖

    • 无法声明字段为 final

写法2:构造器注入(Constructor Injection)

java

@RequiredArgsConstructor public class PrintTemplateController { private final PrintTemplateService templateService; }
  • 特点:使用 Lombok 生成包含所有 final 字段的构造器

  • Spring 会自动通过构造器注入依赖

  • 优势

    • 依赖不可变(final)

    • 便于单元测试(可以直接传参)

    • 保证依赖完整性(对象创建时所有依赖就位)

    • 避免循环依赖问题

    • 符合不可变对象设计原则

推荐写法

强烈推荐写法2(构造器注入)

理由:

  1. 不可变性:final 字段确保依赖不会在运行时被修改

  2. 可测试性:可以直接在测试中 new 出对象

  3. 代码更安全:编译时就能发现依赖问题

  4. Spring 官方推荐:Spring 官方自 4.3 版本起推荐构造器注入

最佳实践

java

@RestController @RequestMapping("/print/template") @Slf4j @RequiredArgsConstructor public class PrintTemplateController { // 使用 final 确保不可变性 private final PrintTemplateService templateService; private final TemplateRenderService renderService; // 如果类比较简单,也可以显式写构造器(代替 @RequiredArgsConstructor) // public PrintTemplateController(PrintTemplateService templateService, // TemplateRenderService renderService) { // this.templateService = templateService; // this.renderService = renderService; // } }

特殊情况

如果必须使用字段注入(比如在某些框架的基类中),可以使用:

java

@Autowired(required = false) // 可选依赖 private SomeService someService;

但一般来说,构造器注入是首选方案,它能让代码更健壮、更易测试、更符合现代 Java 编程规范。

那为什么搞了@Autowired这个出来 ?

这是个很好的问题!@Autowired的出现有其历史和技术背景:

历史演进

1.早期 Spring(Spring 1.x-2.x)

主要使用XML 配置

xml

<bean id="userService" class="com.example.UserService"> <property name="userDao" ref="userDao"/> </bean>

这种方式繁琐且容易出错。

2.Spring 2.5(2007年)引入了 @Autowired

初衷是为了简化配置

java

@Component public class UserService { @Autowired // 这当时是个巨大的进步! private UserDao userDao; }

在当时看来,这简直是"魔法":

  • 告别冗长的 XML

  • 代码更简洁

  • 开发效率大幅提升

为什么还需要 @Autowired?

即使现在推荐构造器注入,@Autowired仍有其价值:

1.可选依赖

java

@Autowired(required = false) private OptionalDependency optionalDep;

2.Setter 注入

某些场景需要重新设置依赖:

java

private DataSource dataSource; @Autowired public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; }

3.复杂场景

  • 多实现选择

java

@Autowired @Qualifier("primaryDataSource") private DataSource dataSource;
  • 集合注入

java

@Autowired private List<Validator> validators; // 注入所有 Validator 实现

4.第三方集成

有些老框架或第三方库必须使用字段注入:

java

// 某些 JPA 实现或旧框架 @PersistenceContext private EntityManager entityManager;

现代 Spring 的智能改进

Spring 4.3+(2016年)的改进

java

// 只有一个构造器时,可以省略 @Autowired @Component public class UserService { private final UserDao userDao; // 不需要 @Autowired! public UserService(UserDao userDao) { this.userDao = userDao; } }

Spring Boot 的进一步简化

配合 Lombok 更加简洁:

java

@Service @RequiredArgsConstructor // Lombok 生成构造器 public class UserService { private final UserDao userDao; // Spring 自动注入 }

技术对比表格

特性@Autowired 字段注入构造器注入
出现时间2007年(Spring 2.5)一直存在,2016年后推荐
当时定位革命性简化方案传统但可靠
当前定位特定场景使用默认推荐
不可变性❌ 不支持 final✅ 支持 final
可测试性较差(需反射)优秀
循环依赖可能隐藏问题立即暴露问题
代码简洁度非常简洁较简洁(配合 Lombok)

历史视角看这个问题

可以把依赖注入的发展看作一个螺旋上升的过程:

  1. XML 配置时代(繁琐但明确)

  2. @Autowired 时代(简化但引入新问题)

  3. 构造器注入复兴(取两者优点:简洁 + 健壮)

结论

@Autowired在当时是革命性的进步,极大地提升了开发体验。但随着最佳实践的演进,我们发现构造器注入在大多数场景下是更好的选择

现代 Spring 开发的建议

  • 首选构造器注入(配合 Lombok@RequiredArgsConstructor

  • ⚠️特定场景用 @Autowired(可选依赖、Setter 注入等)

  • 避免随意使用字段注入

这就好比:电锯(@Autowired)让伐木更高效,但熟练后你会发现斧头(构造器注入)在某些场景更安全可控。工具本身没有绝对的好坏,关键看如何正确使用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/4 17:32:16

vue和springboot框架开发的小程序 智能包裹配送服务管理系统_q3k407ra

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 同行可拿货,招校园代理 vueSpringboot智能包裹配送服务管理系统_钱快07ra 框…

作者头像 李华
网站建设 2026/8/5 20:21:37

C 语言输入与输出(I/O)详解

C 语言输入与输出(I/O)详解 引言 C 语言作为一种广泛使用的编程语言,其输入与输出(I/O)操作是编程中不可或缺的部分。本文将深入探讨 C 语言中的输入与输出操作,包括标准输入输出、文件操作以及如何提高 I/O 效率。 标准输入输出 标准输入 在 C 语言中,标准输入通常…

作者头像 李华
网站建设 2026/8/6 22:20:20

软件测试成本的多维解析与优化路径

在软件开发的生命周期中&#xff0c;测试环节的成本投入直接影响项目的质量底线与商业回报。根据业界研究&#xff0c;测试成本通常占据项目总预算的15%-40%&#xff0c;这一比例在金融、医疗等高可靠性要求的领域甚至更高。对测试成本构成的深刻理解&#xff0c;不仅关乎资源调…

作者头像 李华
网站建设 2026/8/4 16:12:46

5-脱氧-L-阿拉伯糖—结构独特的稀有单糖,药物设计与合成化学的宝贵砌块 CAS:13039-56-0

5-脱氧-L-阿拉伯糖是一种天然存在但相对稀有的五碳脱氧单糖&#xff0c;其独特的L-构型与脱氧结构赋予其区别于常见D-型糖的化学与生物学特性。作为手性合成与药物化学中的高价值砌块&#xff0c;它正日益受到糖化学、抗感染药物研发及糖生物学研究领域的关注。化学信息化学名称…

作者头像 李华
网站建设 2026/8/7 1:39:08

2-乙酰胺基-1,3,4,6-四-O-乙酰基-2-脱氧-5-硫代-α-D-吡喃葡萄糖 —— 糖化学与药物研发的关键砌块 CAS:67561-97-1

2-乙酰胺基-1,3,4,6-四-O-乙酰基-2-脱氧-5-硫代-α-D-吡喃葡萄糖是糖化学与糖药物研究领域中一类重要的修饰单糖衍生物。作为5-硫代葡萄糖的结构前体与保护形式&#xff0c;它不仅是糖生物学基础研究的关键工具分子&#xff0c;更为开发新型糖基化抑制剂、糖模拟药物及诊断探针…

作者头像 李华
网站建设 2026/8/7 14:36:02

群体分析如何改变你的客户洞察

原文&#xff1a;towardsdatascience.com/how-cohort-analysis-can-transform-your-customer-insights-ff7e221b8fdc 尽管进行了数月的营销努力&#xff0c;但你的销售额仍在下降&#xff0c;客户参与度也在下降。出了什么问题&#xff1f;如果有一种方法可以精确地确定客户何时…

作者头像 李华