深度解析:IService 与 ServiceImpl 的区别

发布于:2025-09-11 ⋅ 阅读:(17) ⋅ 点赞:(0)

在使用 MyBatis-Plus 开发业务逻辑时,IServiceServiceImpl 是经常遇到的两个核心类。很多初学者会疑惑:

  • 为什么要定义 IService
  • ServiceImpl 又解决了什么问题?
  • 它们之间到底有什么区别与联系?

本文将结合源码与应用场景,带你彻底搞懂 IService 与 ServiceImpl 的区别


1. IService 是什么?

IService<T> 是 MyBatis-Plus 提供的 通用业务接口,其中包含了常用的 CRUD 方法,比如:

  • save —— 保存实体
  • removeById —— 根据 ID 删除
  • updateById —— 根据 ID 更新
  • getById —— 根据 ID 查询
  • list —— 查询列表
  • page —— 分页查询

换句话说,IService 定义了通用的服务层规范

使用示例

public interface UserService extends IService<User> {
    // 你可以在这里扩展业务专属方法
    User findUserByEmail(String email);
}

这里 UserService 继承了 IService<User>,自动拥有了 CRUD 的能力。


2. ServiceImpl 是什么?

ServiceImpl<M, T> 是 MyBatis-Plus 提供的 IService 默认实现类,已经帮我们实现了大多数方法,避免了重复造轮子。

  • M:具体的 Mapper 类型,例如 UserMapper
  • T:实体类型,例如 User

它实现了 IService 接口,内部封装了对 Mapper 的调用逻辑。

使用示例

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Override
    public User findUserByEmail(String email) {
        return lambdaQuery().eq(User::getEmail, email).one();
    }
}

这里 UserServiceImpl 继承了 ServiceImpl,再实现我们自定义的 UserService,这样就既拥有通用的 CRUD,又能编写业务逻辑。


3. 区别与联系

特性 IService ServiceImpl
定义 接口,定义了通用 CRUD 规范 实现类,提供了默认实现
泛型 <T> 实体类 <M, T>,分别是 Mapper 和实体类
作用 抽象层,保证服务接口统一 具体实现,避免手写重复代码
扩展性 可以在子接口中定义业务方法 可以在子类中实现业务逻辑
是否必须 建议使用,利于解耦 通常需要,直接继承即可

4. 常见使用方式

在项目中通常的结构是:

  1. 实体类
    User.java
  2. Mapper 层
    UserMapper extends BaseMapper<User>
  3. Service 接口层
    UserService extends IService<User>
  4. Service 实现层
    UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService

这样,整个项目既保持了 MyBatis-Plus 的通用 CRUD,又能灵活扩展业务逻辑。


5. 为什么要区分 IService 和 ServiceImpl?

很多人可能会问:直接写 ServiceImpl 不就够了吗?

原因在于:

  • 接口分离IService 让我们在业务层面编程时,可以面向接口,而不是依赖实现类。
  • 可扩展性:当我们需要切换实现方式(比如缓存+DB、多数据源),只需要改实现类,而不影响接口层调用。
  • 解耦:接口与实现分离是面向对象设计的基本原则。

6. 总结

  • IService:定义了 CRUD 的接口规范,是抽象层

  • ServiceImpl:提供了 IService默认实现,是具体实现层

  • 通常做法:

    • UserService extends IService<User>
    • UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService

这样既能享受 MyBatis-Plus 的便捷,又能保证业务逻辑清晰解耦。


👉 简而言之:
IService = 规范,ServiceImpl = 实现。
两者搭配使用,才是 MyBatis-Plus 推荐的最佳实践。


网站公告

今日签到

点亮在社区的每一天
去签到