我正在构建一个Spring应用程序,其中每个实体(人)都可以执行3个任务,例如Walk,Talk和Think。
由于所有这些功能都是Person的某种功能,因此我正在考虑制作一个接口Capability.java
,该接口将具有方法performTask()
。
上面的3个类将实现Capability.java
,还将具有自己的其他特定方法集。
由于这3个类别是动词,因此我将它们设为@Service
,即
WalkServiceImpl.java
TalkServiceImpl.java
ThinkServiceImpl.java
另外,我正在考虑制作一个@Controller - PersonController
,它将调用这3个类中的performTasks()
。
要在PersoneController
中使用这些类,我必须将它们自动接线。通常,我们应该始终@Autowire
接口。
但是这里的3个类有一个公共接口,使用该接口我无法调用控制器中所有3个服务的performTaks()
。
因此,我的问题是,我应该做什么(A或B)?:
A.另外制作3个独立的接口,即。 WalkService, TalkService & ThinkService
,它扩展了Capability.java
并在控制器中自动连接这些类?
B.直接在控制器中自动接线WalkServiceImpl, TalkServiceImpl & ThinkServiceImpl
?
最佳答案
如果您为一个bean连接接口,那实际上是在说,您期望仅存在一种实现-或该配置可以解决问题,并使您只有一个主要的选择。显然,这不是您想要的。
如果您问我,明确地连接这三个服务的想法是可疑的。如果您在设计时就已经知道,将始终存在哪些特定服务,为什么还要自动布线?然后,您可以对它们进行硬编码并完成它。如果您想放弃对细节的控制,自动装配非常有用。使用自动装配,但强迫它仅做一件非常具体的事情……不是很有用。
所以,不,如果有很多能力-考虑到未来,也许人们也将能够游泳,开车,跳跃...-那么您也许应该尝试的是建立一家可以生产任何类型能力的工厂-或更好的是,从Spring获得所有可用的。
为什么不简单地连接实现该接口的所有bean的列表呢?
@Autowired
private Set<Capability> capabilities;
然后,工厂(或人员或其他任何人)可以访问所有现有功能。也许这些功能可以通过某种方式检查向谁应用?
当然,@ Buhb所说的很可能是对的,这听起来像是一个过度设计的可怕解决方案,但是显然我们在谈论一些玩笑,所以为什么不呢。