深度解析:IService 与 ServiceImpl 的区别
在使用 MyBatis-Plus 开发业务逻辑时,IService
和 ServiceImpl
是经常遇到的两个核心类。很多初学者会疑惑:
- 为什么要定义
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 {@Overridepublic User findUserByEmail(String email) {return lambdaQuery().eq(User::getEmail, email).one();}
}
这里 UserServiceImpl
继承了 ServiceImpl
,再实现我们自定义的 UserService
,这样就既拥有通用的 CRUD,又能编写业务逻辑。
3. 区别与联系
特性 | IService | ServiceImpl |
---|---|---|
定义 | 接口,定义了通用 CRUD 规范 | 实现类,提供了默认实现 |
泛型 | <T> 实体类 | <M, T> ,分别是 Mapper 和实体类 |
作用 | 抽象层,保证服务接口统一 | 具体实现,避免手写重复代码 |
扩展性 | 可以在子接口中定义业务方法 | 可以在子类中实现业务逻辑 |
是否必须 | 建议使用,利于解耦 | 通常需要,直接继承即可 |
4. 常见使用方式
在项目中通常的结构是:
- 实体类
User.java
- Mapper 层
UserMapper extends BaseMapper<User>
- Service 接口层
UserService extends IService<User>
- 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 推荐的最佳实践。