Spring @Autowire 关于属性与构造函数

2024-01-04

因此,由于我一直在使用 Spring,如果我要编写一个具有依赖项的服务,我将执行以下操作:

@Component
public class SomeService {
     @Autowired private SomeOtherService someOtherService;
}

我现在遇到了使用另一个约定来实现相同目标的代码

@Component
public class SomeService {
    private final SomeOtherService someOtherService;

    @Autowired
    public SomeService(SomeOtherService someOtherService){
        this.someOtherService = someOtherService;
    }
}

这两种方法都有效,我明白。但是使用选项 B 有什么优势吗?对我来说,它在类和单元测试中创建了更多代码。 (必须编写构造函数并且无法使用@InjectMocks)

我有什么遗漏的吗?除了向单元测试添加代码之外,自动装配构造函数还有其他作用吗?这是进行依赖项注入的更优选方法吗?


是的,实际上比字段注入更推荐选项 B(称为构造函数注入),并且有几个优点:

  • 依赖性被明确识别。在测试或在任何其他情况下实例化对象时(例如在配置类中显式创建 bean 实例),都无法忘记一个对象
  • 依赖关系可以是最终的,这有助于增强鲁棒性和线程安全性
  • 您不需要反射来设置依赖项。 InjectMocks 仍然可用,但不是必需的。您可以自己创建模拟并通过简单地调用构造函数来注入它们

See 这篇博文 http://olivergierke.de/2013/11/why-field-injection-is-evil/有关 Spring 贡献者之一撰写的更详细的文章,奥利维尔·吉尔克 https://stackoverflow.com/users/18122/oliver-gierke.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring @Autowire 关于属性与构造函数 的相关文章

随机推荐

  • 任何人都可以翻译 X12 271 医疗保健回复 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 代码 将 271 医疗保健资格福利响应转换为更可用的格式 以便我可以将某些段和值显示到
  • 未找到资源绘图

    当我在手机上安装应用程序时 它立即崩溃 告诉我找不到可绘制对象 Resource com aaronapp hideme drawable ic clear 7f07007a is not a Drawable color or path
  • 如何在没有 php Artisan 服务的情况下查看 laravel 视图

    我怎样才能看到Laravel无需 artisan 命令即可查看CLI 我没有CLI从我的托管提供商处 我只能访问FTP 跑步Laravel我必须使用这个命令CLI php artisan serve port 8080 host 0 0 0
  • 如何从多个进程中拆分和重新加入 STDOUT?

    我正在开发一个管道 该管道有几个随后合并的分支点 它们看起来像这样 command2 command1 command4 command3 每个命令写入 STDOUT 并通过 STDIN 接受输入 来自 command1 的 STDOUT
  • 如何将长日期值转换为 mm/dd/yyyy 格式[重复]

    这个问题在这里已经有答案了 可能的重复 将长字符串转换为日期 https stackoverflow com questions 11753341 converting long string to date 我需要转换long日期值至月
  • 如何对应用程序状态建模?

    我正在编写一个游戏 我想以一种干净的 面向对象的方式对其不同的状态进行建模 我猜 Game Maker 的类比是框架 以前 我是通过以下方式完成的 class Game enum AppStates APP STARTING APP TIT
  • SQL Server 数据库迁移向导发生了什么?

    SQL Server 数据库迁移向导 又名 SQL Azure 迁移向导 以前位于http sqlazuremw codeplex com http sqlazuremw codeplex com 但已经消失了 我试图通过谷歌搜索它的新家
  • 未找到带标签的句柄可放入图例折线图中

    我正在使用 matplotlib 绘制折线图 在所有其他情况下 它通常会自动检测图例 但这次我使用数据透视表来绘制图表 我认为这会阻止它 我不确定如何绘制图例 No handles with labels found to put in l
  • GWT + 流程构建器

    是否可以将 ProcessBuilder 与 GWT 一起使用 当我声明一个新 ProcessBuilder 的实例时 我得到 java lang ProcessBuilder is not supported by Google App
  • 将 .Glade(或 xml)文件转换为 C 源代码的工具

    我正在寻找可以将 Glade 或 xml 文件转换为 C 源代码的工具 我尝试过 g2c Glade To C Translator 但我正在寻找 Windows 二进制文件 任何人都知道有什么好的窗口工具 Thanks PP 你不需要工具
  • Firebase 存储下载我上传的原始文本,而不仅仅是网址

    我上传了一个原始的String使用提供的示例对 firebase 存储进行 测试 here https firebase google com docs storage web upload files upload from a stri
  • DatePicker 的 setMinDate() [重复]

    这个问题在这里已经有答案了 我在几个地方看到了有关堆栈溢出的这个问题 但给出的答案对我不起作用 所以我在这里 我需要将日期选择器的最小日期动态设置为当前日期 我的最低 API 是 12 我试过这个 Calendar minCalendar
  • 如何阻止一个节点上的死锁导致整个集群崩溃?

    我正在 MariaDB 下运行 3x 节点 Galera 集群 该应用程序采用 PHP 语言 使用 mysqli 扩展 偶尔我会得到一个Deadlock https dev mysql com doc refman 5 5 en error
  • 使用 javascript 更改图像不透明度

    如何使用 javascript 更改图像不透明度 我将使用 javascript 创建淡入淡出效果 有示例吗 有没有像 image opacity 这样的东西可以通过 JS 代码更改 它是如何设置的 thanks 假设您使用纯 JS 请参阅
  • Spring @Autowire 关于属性与构造函数

    因此 由于我一直在使用 Spring 如果我要编写一个具有依赖项的服务 我将执行以下操作 Component public class SomeService Autowired private SomeOtherService someO