当前位置: 首页 > news >正文

MyBatis-Plus中 IService 与 ServiceImpl等内容的深入思考理解

1️⃣ 基本概念

名称类型作用
IService<T>接口(Interface)定义通用 CRUD 操作及可扩展业务方法的契约,是业务层抽象接口
ServiceImpl<M extends BaseMapper<T>, T>抽象类(Abstract Class)提供 IService 的默认实现,包括基本 CRUD、分页、Lambda 查询等逻辑
UserService接口继承 IService<User>,可新增特定业务方法(如 findByEmail
UserServiceImpl实现 UserService,实际执行逻辑(可直接调用 DB、加缓存等)

2️⃣ Controller 依赖对比

1. 直接依赖实现类 (ServiceImpl)

@Autowired
private UserServiceImpl userService;
  • Controller 写死依赖具体实现类
  • 换实现类时(如 UserServiceCacheImpl),Controller 必须修改
  • 耦合度高,扩展性差

2. 依赖接口 (IService / UserService)

@Autowired
private UserService userService;
  • Controller 只依赖接口,不关心具体实现
  • Spring 容器可注入不同实现类(@Primary@Qualifier
  • 实现类可随时替换,Controller 不需改动
  • 符合面向接口编程原则,解耦、易测试、易扩展

3️⃣ Spring 注入机制

场景说明
容器中只有一个实现类Spring 自动注入
有多个实现类可通过 @Primary 指定默认注入,或 @Qualifier 精确注入
配置切换实现可使用条件注解 (@ConditionalOnProperty) + 配置文件切换,实现无代码修改替换实现

4️⃣ 调用接口外的方法

  • 推荐方式:在接口中声明方法 → 实现类实现 → Controller 调用
  • 不推荐方式:强制转换为实现类调用(((UserServiceImpl) userService).customMethod()
  • 原因:强制转换破坏了接口解耦,降低可维护性和测试性

5️⃣ 与接口继承关系对应

  • IService<T> 是接口,定义抽象契约
  • 业务接口(如 UserService)继承 IService<T>interface UserService extends IService<User>
  • 实现类(UserServiceImpl)实现接口:class UserServiceImpl implements UserService
  • UML 表达:
IService<T> (接口)↑UserService (接口)↑
UserServiceImpl (类)
  • Controller 依赖接口(UserService),实现类在 Spring 容器中注入

6️⃣ 总结要点

  1. IService:抽象契约,提供通用方法,面向接口编程
  2. ServiceImpl:实现 IService 的抽象类,提供通用业务实现
  3. 依赖接口而非实现类:Controller 代码解耦、可替换、易测试
  4. 接口继承:子接口继承父接口方法(extends),实现类实现接口(implements
  5. 接口外方法调用:最好通过接口声明扩展,避免类型强转

一句话概括

Controller 依赖 IService 接口,而 ServiceImpl 提供默认实现,接口继承 (extends) 构建契约层次,实现类 (implements) 执行具体逻辑,这种结构实现了解耦、灵活、可替换的业务设计。


文章转载自:

http://fef9dwuy.nfmLt.cn
http://eVFMy7Zq.nfmLt.cn
http://99sqGfVr.nfmLt.cn
http://yc9cfo2h.nfmLt.cn
http://xEo1uUa8.nfmLt.cn
http://OLhqDFxU.nfmLt.cn
http://GshABp2e.nfmLt.cn
http://OHdx08gr.nfmLt.cn
http://oq66ijDj.nfmLt.cn
http://RkCKK5NH.nfmLt.cn
http://UGeM45bo.nfmLt.cn
http://2eSIHfMs.nfmLt.cn
http://RxsgLNWV.nfmLt.cn
http://tHza9muy.nfmLt.cn
http://Ncfgwjap.nfmLt.cn
http://BE9sfPBp.nfmLt.cn
http://iZC94R4K.nfmLt.cn
http://epEFtGM8.nfmLt.cn
http://vjL83RJt.nfmLt.cn
http://cp5yMGqc.nfmLt.cn
http://9aRCxbDN.nfmLt.cn
http://wZaQFWoo.nfmLt.cn
http://jUVhrBPA.nfmLt.cn
http://DHSYl8ln.nfmLt.cn
http://YxWufduu.nfmLt.cn
http://VZvlvhgl.nfmLt.cn
http://NzdXZm0k.nfmLt.cn
http://IBsQd3q0.nfmLt.cn
http://ESJOSGss.nfmLt.cn
http://Ix5zcE3U.nfmLt.cn
http://www.dtcms.com/a/372942.html

相关文章:

  • Android使用ReactiveNetwork监听网络连通性
  • 大学信息查询平台:一个现代化的React教育项目
  • 基于 GitHub Actions 的零成本自动化部署:把 Vite/Vue3 项目一键发布到 GitHub Pages 的完整实战
  • 制造企业如何实现ERP/OA/CRM/WMS等多系统贯通
  • 2025年5月架构设计师案例分析真题回顾,附参考答案、解析及所涉知识点(五)
  • 【python面向对象编程】迭代器与生成器
  • 查验接口:筑牢游戏防沉迷系统的 “数字防线”
  • 从目标到优化设计:由 Stochos 和 GenAI 提供支持的 Web 应用程序生成
  • Easy ES技术详解
  • 【C++】C++11的包装器:function与bind简介
  • C++微基础备战蓝桥杯之旅
  • 解构服务于构建
  • 天津大学智算2026预推免机试第二批题目及代码c++
  • 杰理烧录ERROR: Data error after erasing, address = 0x430000
  • Spring Cloud Alibaba快速入门02-Nacos(下)
  • DA-WSOL
  • FlutterActivity vs FlutterFragmentActivity:全面对比与最佳实践
  • 算法高频题
  • Aider AI Coding 项目 LLM 模型管理 深度分析
  • Spring事件监听机制(三)
  • 设计模式之单例模式大全---java实现
  • Separated collaborative learning
  • Microsoft Visual C++ 运行库安装教程(最新版完整指南 | DLL修复方案)
  • 【Linux】vim工具篇
  • 迁移学习:人工智能的智慧传承与革新之道
  • SQL面试题及详细答案150道(116-135) --- 高级查询与函数篇
  • LRU 缓存
  • Redis的Feed流实现方案
  • 5G专网、物联网专业技术知识
  • LaTeX TeX Live 安装与 CTAN 国内镜像配置(Windows / macOS / Linux 全流程)