【问题标题】:Always provide interface while autowiring?自动装配时总是提供接口?
【发布时间】:2017-01-11 15:10:48
【问题描述】:

我正在构建一个 Spring 应用程序,其中每个实体(Person)可以执行 3 个任务,例如,Walk、Talk & Think

由于所有这些都是 Person 的某种能力,我正在考虑制作一个接口 Capability.java,它将有一个方法 performTask()

以上 3 个类将实现 Capability.java 并且还将有自己的一组其他特定方法。

由于这 3 个类都是动词,所以我将它们设为 @Service,即

  1. WalkServiceImpl.java
  2. TalkServiceImpl.java
  3. ThinkServiceImpl.java

另外,我正在考虑制作一个@Controller - PersonController,它将调用这三个类中的performTasks()

要在PersoneController 中使用这些类,我必须自动装配它们。作为一般惯例,我们应该始终@Autowire 接口。

但是这里 3 个类有一个公共接口,我无法使用它调用控制器中所有 3 个服务的 performTaks()

所以,我的问题是,我应该怎么做(A 或 B)?:

A.另外制作3个独立的接口,即。 WalkService, TalkService & ThinkService,它扩展了 Capability.java 并在控制器中自动装配这些类?

B.直接在控制器中自动装配WalkServiceImpl, TalkServiceImpl & ThinkServiceImpl

【问题讨论】:

  • 你只能使用一个接口,你可以这样命名bean:stackoverflow.com/questions/5576128/…
  • 您真的需要能够交替使用这些功能吗?否则,我认为您通过创建 Capability 接口过度设计了您的应用程序。
  • @DavidPérezCabrera,我阅读了您建议的帖子,但仍然没有完全理解。你能帮我举个例子吗?

标签: java spring design-patterns


【解决方案1】:

如果您为一个 bean 连接接口,您实际上是在说,您希望只存在一个实现 - 或者配置会解决问题并为您留下一个主要候选者。显然,这不是你想要的。

如果你问我,明确连接三个服务的想法是有问题的。如果您在设计时就已经知道,总会有哪些特定的服务,为什么要自动装配?然后你可以对它们进行硬编码并完成它。如果您想放弃对细节的控制,自动装配非常棒。使用自动装配但强制它只做一件非常具体的事情......不是很有用。

所以,不,如果有很多能力——想想未来,也许人也能游泳、开车、跳跃……那么你或许应该尝试做一些可以生产任何类型的工厂能力 - 或者更好,从 Spring 获取所有可用的能力。

为什么不简单地连接实现接口的所有 bean 的列表?

@Autowired
private Set<Capability> capabilities;

然后工厂(或人,或其他)可以访问所有存在的功能。也许这些功能有某种方法可以检查它们适用于哪个人?

当然,@Buhb 所说的很可能是真的,这听起来像是一个可怕的过度设计的解决方案,但显然我们正在谈论一些玩弄,所以为什么不呢。

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 2015-07-17
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 2017-03-14
    相关资源
    最近更新 更多