【问题标题】:What are the advantages of constructor autowiring over normal autowiring or property autowiring?构造函数自动装配比普通自动装配或属性自动装配有什么优势?
【发布时间】:2018-07-05 02:40:08
【问题描述】:

构造函数自动装配比属性自动装配有什么特定的优势......还是普通的......?高级强制团队在 Spring Boot 中使用构造函数自动装配 .. 它有什么特定的优势吗?两种自动装配的优缺点

【问题讨论】:

  • 其中之一是,在测试时,对构造函数进行模拟很容易,但对属性进行模拟则有点困难
  • 经验法则:坚持构造函数注入。为什么?构造函数指定被实例化的类所需的依赖关系。另一方面,使用 setter/field 注入,您总是需要查找它们(通过查看源代码)。您可能会遇到麻烦(例如 NPE),因为实例缺少一些必需的依赖项。看看olivergierke.de/2013/11/why-field-injection-is-evil
  • 感谢您的回复.. 使用构造函数自动装配有什么缺点吗?
  • @benny 我不知道。它实际上使您免于连接循环依赖项(这不是 setter/field 注入的情况)。

标签: spring spring-boot


【解决方案1】:

构造函数自动装配的优势在于您可以使连线的字段成为最终的(如果您的 bean 将从多个线程中调用,则特别有用,因为使用 final 更容易分析线程安全)。并且您可以确保 bean 始终以有效的方式构建(尽管您始终可以实现 InitializingBean 并使用 afterPropertiesSet 方法来实现相同的效果,如果您在属性中进行布线)。

如果你有很多字段,那么连接属性会更好,因为它可以避免在你的构造函数中有很多参数,如果你使用 xml,按名称连接不太容易混淆变量(考虑一个有很多参数的构造函数一种类型 - 很容易连接错误的变量)。连接属性还使得拥有可选属性变得更容易 - 带有构造函数连接的可选属性将需要多个构造函数,这很快就会变得复杂。

总而言之,这两种方法各有利弊 - 我们通常使用属性连接,除非有特殊原因我们应该使用构造函数连接。

【讨论】:

  • 不同意Wiring properties can be better if you have many fields...。这通常是代码异味的标志,因为该类可能有太多责任。
【解决方案2】:

构造函数连线也有助于编写无错误代码。如果您通过构造函数自动装配来连接依赖项,您将能够使用模拟框架轻松模拟它们,并通过构造函数注入它们。

具体来说,Mockito 在模拟依赖项时会静默失败,如果您没有使用构造函数自动装配,则很难调试代码中断的位置。

如果您遵循 TDD 编写大型企业应用程序,构造函数自动装配很有帮助。

【讨论】:

    猜你喜欢
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    相关资源
    最近更新 更多