gpt4 book ai didi

java - Autowiring 时始终提供接口(interface)?

转载 作者:行者123 更新时间:2023-12-02 03:23:32 25 4
gpt4 key购买 nike

我正在构建一个 Spring 应用程序,其中每个实体()都可以执行 3 项任务,例如行走、交谈和思考

由于它们都是某种 Person 的功能,因此我正在考虑创建一个接口(interface) Capability.java,其中将有一个方法 performTask()

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

因为这 3 个类是动词,所以我将它们设置为 @Service,即

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

此外,我正在考虑创建一个 @Controller - PersonController,它将调用这 3 个类的 performTasks()

要在 PersonController 中使用这些类,我必须 Autowiring 它们。作为一般实践,我们应该始终@Autowire接口(interface)。

但是这里的 3 个类有一个公共(public)接口(interface),我无法使用该接口(interface)调用 Controller 中所有 3 个服务的 performTaks()

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

A.另外制作 3 个独立的接口(interface),即。 WalkService、TalkService 和 ThinkService,它扩展了 Capability.java 并在 Controller 中 Autowiring 这些类?

B.直接在 Controller 中 Autowiring WalkServiceImpl、TalkServiceImpl 和 ThinkServiceImpl

最佳答案

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

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

所以,不,如果有很多能力 - 想想 future ,也许人们还能够游泳,开车,跳跃...... - 那么你也许应该尝试的是建立一些可以生产任何类型的工厂能力 - 或者更好,从 Spring 获取所有可用的能力。

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

@Autowired
private Set<Capability> capabilities;

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

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

关于java - Autowiring 时始终提供接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39310400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com