【问题标题】:Spring Autowiring, I only have one implementation should I autowire? And if so, should I autowire the implementation?Spring自动装配,我只有一个实现应该自动装配吗?如果是这样,我应该自动装配实现吗?
【发布时间】:2017-05-11 13:39:35
【问题描述】:

这更像是一个最佳实践类型的问题。

我已经听过几十次了:

a) 在 Spring 中自动装配时,最佳实践是自动装配接口“而不是”实现。

和..

b) 我还听说如果您只有“一个”实现,那么您不应该真正使用接口。

这是我的困境,我有一个接口“MyService”和一个实现MyServiceImpl。我在“MyServiceTest”中使用@Autowiredz MyService inMyController`。

我不需要其他实现。

显然这违反了规则 b),但自动装配实现将违反规则 a)。

所以我的问题是......我该怎么办?在这种情况下我是否应该选择完全不使用 Spring 而只使用 new 关键字实例化“MyService”?

【问题讨论】:

  • 不要使用新关键字!如果您使用 new 关键字,则该服务不再处于 spring 的上下文中。
  • 谢谢,那么在这种情况下最好的做法是什么?完全失去接口而只是自动装配实现?或者使用自动装配接口保持原样(即使我只有一个实现?)。

标签: java spring spring-mvc spring-boot autowired


【解决方案1】:

实践是代码到接口而不是实现。如果您总是尝试对接口进行编码,那么您的代码将更加灵活且松散耦合。所以应该努力练习选项a)。

但是对此有相反的论据。许多其他杰出的开发人员认为,除非您有多个实现,否则不需要接口。在只有单个实现的情况下,您可以直接 @Autowire 类。这不会是世界末日,也不会大幅提高或降低性能。但正如我之前提到的,选项 a) 代码比选项 b) 更加灵活和松耦合。

【讨论】:

    【解决方案2】:

    我建议使用interface,因为我喜欢有机会创建另一个实现,即使我目前不需要。但是应用程序会在开发阶段或以后发生变化。还有一个人需要另一个人 要求。

    所以对我来说很清楚,对未来的变化持开放态度。

    【讨论】:

      【解决方案3】:

      您应该自动装配接口,因为这样当您以后想更改实现时,您只需在@Autowire 上方添加@Qualifier 而无需更改代码中的名称。当您注入模拟实现时,它也更适合用于测试目的。

      【讨论】:

        【解决方案4】:

        我会建议你使用 interface,因为将来如果有人想增强/实现,它会很有用。

        并且没有任何地方规定严禁违反规则 b。 您可以只使用在 interface 上使用 @Autowired 并在实现上使用 @Component 的规则。

        了解更多info go with this answer

        【讨论】:

        • 我相信还有一个选择。目前我使用 moks (mockMvc) 来测试我的控制器。我可以改为创建一个 MyServiceStub 实现并将其注入控制器。
        • 对该解决方案有什么想法吗?
        • 我认为这个答案更合适,来自 Spring[boot] 4。不过我想补充一点,规则 b 不是一个非常可维护的解决方案,如果您的软件需要可维护性,应该被彻底废除。正如其他答案所提到的,忽略规则 b 至少对测试有好处。
        【解决方案5】:

        没有明确的答案。如果有意义,请使用接口。不要因为接口“更好”而对所有事情都使用接口。这不是 Spring 特定的概念。

        如果它是单个实现不太可能被修改并且是您的应用程序独有的,请继续并跳过该接口。如果这是一个永远不会离开您的应用程序的单一专有实现,那么使用它并没有真正的好处。即使它经常变化,如果它是应用程序独有的单个类,只要行为(预期的输入和输出)不改变,你仍然不需要接口。

        如果您是生产者并且其他应用程序可能会使用您的代码,请使用接口。这允许使用您的库,只要您坚持接口,您就可以根据自己的意愿修改代码(这意味着您不会更改行为,但会更改实现)。

        如果您确实使用接口,则自动装配接口,而不是实现。

        【讨论】:

          猜你喜欢
          • 2020-09-04
          • 1970-01-01
          • 2015-03-29
          • 1970-01-01
          • 1970-01-01
          • 2015-11-22
          • 1970-01-01
          • 2011-01-23
          • 1970-01-01
          相关资源
          最近更新 更多