Java中通过泛型抽象类BaseController提取通用CRUD接口,使用T和ID泛型参数、抽象方法getEntityClass()与getService(),结合Spring MVC注解实现复用;子类只需继承并实现抽象方法,即可获得完整REST API。

在 Java 中,通过继承抽象类 BaseController 提取通用 CRUD 接口,核心是把增删改查的共性逻辑上提到父类,同时保留子类对业务实体和具体行为的控制权。关键在于用泛型 + 模板方法 + Spring MVC 注解组合实现复用,而非硬编码具体类型或路径。
定义泛型抽象 BaseController
让 BaseController 支持任意实体类型和对应的服务层,避免重复写 @GetMapping、@PostMapping 等注解逻辑:
- 使用两个泛型参数:
T表示实体类型,ID表示主键类型(如 Long、String) - 声明抽象方法
getEntityClass()和getService(),强制子类提供具体类型和服务实例 - 用
@ResponseBody统一返回 JSON,配合@RequestMapping设置基础路径前缀(如 "/api")
在 BaseController 中实现通用 CRUD 方法
每个方法都基于泛型和抽象方法动态获取类型与服务,例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
@GetMapping("/{id}")方法调用getService().findById(id),返回ResponseEntity<T> -
@PostMapping方法接收@RequestBody T entity,调用getService().save(entity) -
@PutMapping("/{id}")先查再更新,或直接调用 update 方法(取决于服务设计) -
@DeleteMapping("/{id}")调用getService().deleteById(id),返回NoContent或Ok
子类只需极简继承并注入依赖
比如 UserAdminController 只需指定实体类型、主键类型,并注入对应 Service:
立即学习“Java免费学习笔记(深入)”;
- 继承
BaseController<User, Long> - 重写
getEntityClass()返回User.class - 重写
getService()返回userService(Spring 自动注入) - 可选:用
@RequestMapping("/users")定义子路径,自动叠加父类前缀
增强灵活性的常见做法
避免过度抽象导致难以定制,可预留扩展点:
- 为 create/update 添加
beforeSave(T entity)钩子方法,子类可校验或补全字段 - 分页查询单独抽一个
list(@RequestParam Map<String, String> params)方法,由子类决定是否启用 - 统一异常处理用
@ExceptionHandler在 BaseController 中捕获 EntityNotFoundException 等标准异常

















