【问题标题】:Why do we need to call Service layer using Interface instead of direct service class from controller in spring为什么我们需要在spring中使用接口而不是直接从控制器中调用服务类来调用服务层
【发布时间】:2021-05-02 18:38:25
【问题描述】:

当 spring 被引入时,它的建议是在不同层之间使用接口,例如 Controller、Service、DAO,而不是使用实际的类引用直接调用它们。

在 Spring 5.x 和 Spring Boot 2.x 的新时代,我们还需要在 Controller 和 Service 类之间使用接口吗?就我而言,我正在开发一个带有单个 GET 方法的 REST 应用程序,该方法调用 DB 并执行一些业务逻辑。所以在我的服务中,在这种情况下我只有一种方法,我仍然需要使用 ServiceInterface 来调用我的实际 ServiceImpl?什么是最佳实践?在这种情况下使用 ServiceInterface 有什么具体优势?

下面是没有ServiceInterface的示例代码

public class MyTestController{

 private MyTestServiceImpl myTestServiceImpl;

public MyTestController(MyTestServiceImpl myTestServiceImpl){
      this.myTestServiceImpl = myTestServiceImpl;
}

@GetMapping("/test")
public String getTestString(){
     myTestServiceImpl.getTestString();
}
}


@Service
public class MyTestServiceImpl(){

 private MyTestRepository myTestRepository;

//constructor

//Service method impl
}

【问题讨论】:

  • 原因是依赖倒置原则(SOLID设计原则中的D)。如果您的问题是,即使在一个简单的应用程序中,我也应该始终这样做吗?我会说不。这些原则旨在帮助您编写可维护的软件。如果那不是您想要的,或者如果软件太简单以至于它实际上会妨碍您。不要这样做。
  • @p.streef 是的,我的问题是我是否需要一直使用它。感谢您的澄清。

标签: spring spring-boot spring-mvc


【解决方案1】:

在非常小的应用程序中,这并不重要,因为仍然很容易跟踪所有类以及哪些类做什么。在大型企业应用程序中,它很快就会变得一团糟。例如,如果您有一个包含 100 个方法的 rest 端点/控制器,它又会在您的 DAO 中调用 50 个方法。如果您在某个时候决定更改 DAO 方法,您现在必须更改控制器/端点中的所有 100 个方法。而如果你有一个服务层来桥接 DAO 和 rest 控制器,你只需要更改服务方法。

@p.streef 提到的另一点是类及其功能的分离。您可以拥有一个模块化应用程序,其中服务层处理所有业务逻辑和规则,DAO 仅负责数据库操作,控制器的唯一工作是发送和接收数据。 S.O.L.I.D 中的 S 代表单一职责原则,因此服务层应该只处理数据的接收和传输,而不是业务逻辑。

但是,如果您正在构建一个非常非常小的应用程序,那么这无关紧要。

【讨论】:

  • 感谢您的意见,我的主要问题是我们什么时候需要在 Controller 和 ServiceImpl 之间使用接口,什么时候不应该。如果我们查看所有 Spring 文档,每个 serviceImpl 示例都将实现一个接口,即使服务实现单个方法。引入 spring 时,它使用 CGLIB 创建代理对象,以创建已定义依赖项的依赖 bean,因此使用接口引用定义依赖 bean 使我的理解更容易。但我不确定它在 Spring 5.x 的新时代是否仍然是好的设计。
  • 这不仅仅是春天特有的。强烈建议通过接口而不是具体实现进行交互。好处是,如果假设将来您想创建新的实现,那么您可以轻松切换到它,而无需对客户端代码进行任何更改。客户端代码表示您使用该接口的位置。它基本上是 OOP 原则中的抽象概念。
猜你喜欢
  • 2013-02-08
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 2013-02-11
  • 2016-05-16
  • 2012-01-23
相关资源
最近更新 更多