19人参与 • 2025-02-28 • C/C++
在 spring 开发中,@autowired
注解常用于实现依赖注入。它可以应用于类的 属性、构造器 或 setter 方法 上。然而,当 @autowired
注解在 属性 上使用时,intellij idea 等 ide 会给出 field injection is not recommended
的警告,而在 setter 方法 上使用 @autowired
时却不会出现这个警告。
当 @autowired
注解应用于类的 属性 上时,spring 会直接注入该属性,而不通过构造函数或 setter 方法显式地传递依赖项。
这种注入方式称为 字段注入(field injection)。
字段注入 的缺点主要体现在以下几个方面:
1.隐式依赖:
2.难以进行单元测试:
3.违反依赖倒置原则(dip):
intellij idea 等 ide 会根据这些设计缺点发出警告,提示 @autowired
注解不推荐使用在属性上。
字段注入的方式可能会导致代码的可维护性差,容易出现一些潜在问题(如不清晰的依赖关系和难以测试的代码)。
当 @autowired
用于 setter 方法 时,spring 会通过 setter 注入 方式将依赖项注入到对象的属性中。
与字段注入不同,setter 注入方式具有以下优势:
显式依赖关系:使用 setter 方法注入,开发者可以明确看到类所依赖的组件。通过查看类的 setter 方法,其他开发者可以轻松理解该类的依赖关系。
public class myservice { private myrepository repository; @autowired public void setrepository(myrepository repository) { this.repository = repository; } }
符合依赖注入的设计原则:通过构造函数或 setter 方法注入依赖项,可以使类的依赖关系更加清晰,符合面向对象设计中的 依赖注入 和 单一职责原则。
setter 注入适用于一些 可选依赖 的场景。如果某个依赖是可选的,可以通过 setter 方法来灵活注入,而不需要在构造器中强制要求依赖项的传入。
@autowired public void setoptionaldependency(optional<dependency> dependency) { this.dependency = dependency.orelse(null); }
myservice myservice = new myservice(); myservice.setrepository(mockrepository);
构造器注入 是 最推荐的依赖注入方式,它具有以下优势:
public class myservice { private final myrepository repository; @autowired public myservice(myrepository repository) { this.repository = repository; } }
setter 注入 是一个灵活的选择,适用于依赖关系较为可选或后期可更改的场景。它具有以下特点:
public class myservice { private myrepository repository; @autowired public void setrepository(myrepository repository) { this.repository = repository; } }
字段注入 是最简单的注入方式,但并不推荐使用,原因已在前面提到。字段注入具有以下缺点:
public class myservice { @autowired private myrepository repository; }
总体而言,使用构造器注入和 setter 注入能够使代码更清晰、易于维护,同时支持更好的单元测试。
如果 ide 提示 field injection is not recommended
,这意味着你可以考虑改用构造器注入或 setter 注入,以便提升代码质量。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论