2016-12-27 72 views
0

这更像是一个最佳实践类型的问题。Spring Autowiring,我只有一个实现,我应该autowire?如果是这样,我应该自动发布实施?

我听说过几十次说:

一)在Spring自动装配时,它是自动装配界面“不”实施最佳实践。

和..

B)我还听说,如果你只有“一”实施,那么你真的不应该是使用的接口。

这是我的困境,我有一个接口'MyService'和一个执行MyServiceImpl。我使用@Autowiredz MyService in MyController`并在'MyServiceTest'中。

我不需要另一个实现。

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

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

+1

不要使用新的关键字!如果您使用新的关键字,则该服务不再处于春天的环境中。 – Patrick

+0

谢谢,那么在这种情况下最好的做法是什么?完全失去接口并仅实现自动连接?或者保持它与自动装配界面一样(即使我只有一个实现?)。 –

回答

1

您应该自动连接接口,因为这种方式当您稍后想要更改实施时,您只需在@Autowire之上添加@Qualifier并且不更改代码中的名称。在注入模拟实现时,它也更适合用于测试目的。

1

这种做法是代码接口不实施。如果你总是试图编写接口,那么你的代码更加灵活和松散耦合。所以应该努力练习选项a)。

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

1

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

因此,对我来说,它明确的,未来的变化是敞开的。

1

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

还有没有声明严禁违反规则b。 你可以在interface@Component的实现上只有@Autowired的规则。

更多info go with this answer

+0

我相信我还有一个选择。目前我使用moks(mockMvc)来测试我的控制器。我可以创建一个MyServiceStub实现并将其注入到控制器中。 –

+0

关于该解决方案的任何想法? –

1

没有明确的答案。如果有意义,请使用界面。不要成为那些为所有东西使用接口的人,因为他们“更好”。这不是Spring特定的概念。

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

如果您是生产者,其他应用程序可能会使用您的代码,请使用界面。只要你坚持接口(这意味着你不改变行为,但改变实现),这允许消费你的库,在那里你可以根据你心中的愿望修改代码。

如果确实使用接口,Autowire接口,而不是实现。

相关问题