这是一个最佳实践类型的问题。
我听过几十次:
a)在Spring中进行自动装配时,最好将接口“而不是”实现自动装配。
和..
b)我也听说如果你只有'one'实现,那么你就不应该使用接口。
这是我的困境,我有一个界面'MyService'和一个实现MyServiceImpl
。我使用@Autowiredz MyService in
MyController`和'MyServiceTest'。
我不需要另外的实现。
显然这违反了规则b),但自动装配实施将违反规则a)。
所以我的问题是......我该怎么办?在这种情况下,我是否应该选择不使用Spring,只使用new关键字实例化“MyService”?
答案 0 :(得分:3)
您应该自动加入界面,因为这样当您希望稍后更改实施时,您只需要在@Qualifier
上方添加@Autowire
而不更改代码中的名称。当您注入模拟实现时,它也更适合测试目的。
答案 1 :(得分:2)
我建议您使用 interface
,因为将来如果有人想要增强/实施,它会很有用。
并且没有任何地方声明严格违反规则b 。
您只能在@Autowired
和interface
上实施@Component
规则。
答案 2 :(得分:2)
没有明确的答案。如果有意义,请使用界面。不要成为那些使用接口的人,因为他们“更好”。这不是Spring特定的概念。
如果它是一个不太可能被修改的单个实现并且是您的应用程序独有的,那么请继续跳过界面。如果这是一个永远不会离开您的应用程序的单一专有实现,那么使用它并没有什么好处。即使它经常更改,如果它是应用程序独有的单个类,只要行为(预期的输入和输出)没有改变,您仍然不需要接口。
如果您是制作人并且其他应用程序可能使用您的代码,请使用界面。这样就可以使用您的库,只要您坚持使用界面(意味着您不会改变行为,而是改变实现),您可以根据自己的意愿修改代码。
如果使用接口,请自动接通接口,而不是实现。
答案 3 :(得分:1)
这种做法是Interface not Implementation的代码。如果您总是尝试编写接口代码,那么您的代码将更加灵活且松散耦合。所以应该努力练习选项a)。
但是有相反的论据。许多其他杰出的开发人员认为除非您有多个实现,否则不需要接口。在只有单个实现的情况下,您可以直接@Autowire该类。它不会是世界末日,也不会大幅增加或减少业绩。但正如我之前提到的选项a)代码比选项b)更加灵活和松散耦合。
答案 4 :(得分:1)
我建议使用interface
,因为我希望有机会创建另一个实现,即使我目前还不需要。但是应用程序将在开发阶段或之后发生变化。还有一个人需要另一个人
要求。
所以对我来说很清楚,对未来的变化持开放态度。