一个注解干翻所有Controller

简介: 一个注解干翻所有Controller

1. 概览

日常开发中,最繁琐的便是编写 Controller。很多公司都制定了规范:Controller 不能存在任何的业务逻辑,主要完成参数解析和结果转换。

不过查看项目源码,你会发现 Controller 中存在了大量不该存在的逻辑,对此,你有什么好的方法?依赖 Code Review?从我角度,我觉得 Controller 根本就不需要存在。

1.1. 背景

之前对 CommandService 和 QueryService 进行封装,通过定义接口的方式快速搭建应用服务,大大提升了开发效率和代码质量,在有了应用服务之后,便是在其基础之上编写 Controller,把能力暴露出去。这是一个非常繁琐且没有技术含量的重复工作。而对于枯燥的重复工作,我的策略一直都是“交由框架完成”。

1.2. 目标

简单的说,我们的目标便是不写Controller,但还要保留 Controller 的效果。

  1. 不需要编写 Controller 代码,将 CommandService 和 QueryService 直接暴露为 Web 接口;
  2. 完成与 Swagger 框架的集成,动态生成 api doc,方便前端接入;

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

2. 快速入门

2.1. 环境准备

首先,在 pom 中增加 lego-starter,具体如下:

<dependency>  
    <groupId>com.geekhalo.lego</groupId>  
    <artifactId>lego-starter</artifactId>  
    <version>0.1.11-rest-SNAPSHOT</version>  
</dependency>

其次,增加 swagger 相关依赖,具体如下:

<dependency>  
    <groupId>io.springfox</groupId>  
    <artifactId>springfox-boot-starter</artifactId>  
    <version>3.0.0</version>  
</dependency>  
<dependency>  
    <groupId>io.springfox</groupId>  
    <artifactId>springfox-data-rest</artifactId>  
    <version>3.0.0</version>  
</dependency>

最后,新建 SpringFoxConfiguration,启用 Swagger 具体如下:

@Configuration  
@EnableSwagger2  
public class SpringFoxConfiguration {  
}

2.2. 初识统一控制器

打开浏览器,输入 http://127.0.0.1:8080/swagger-ui/ 打开 swagger 界面,会发现新增两个 Controller:

command-dispatcher-controller 是对 CommanderService 的Web暴露,主要用于执行写入和更新等业务操作,两个接入点包括:

  1. RequestBody 接入。以 json 作为入参,适用于复杂的参数结构;
  2. RequestParam 接入。以 param 作为参数,适用于简单场景;

query-dispatcher-controller 是对 QueryService 的Web暴露,主要用于执行业务的查询操作,同样支持 RequestBody 和  RequestParam 两种接入方式。与 command-dispatcher-controller 唯一区别是提供了对 Get 方法支持。

但在展开方法后,有点让人绝望。

serviceName 和 method 两个参数从哪获取?nativeRequest 和 nativeResponse 又是什么东西?这两个接口怎么使用?

看不明白也正常,因为我们不会直接使用这两个处理器。

2.3.  Command 控制器

2.3.1. 启用 Command 控制器

OrderCommandService 接口上增加 @AutoRegisterWebController 注解,将其对外暴露为 Web 端口。

@CommandServiceDefinition(  
        domainClass = Order.class,  
        idClass = Long.class,  
        repositoryClass = OrderRepository.class)  
@AutoRegisterWebController(name = "order")  
public interface OrderCommandService{  
    void cancel(Long orderId);  
    Long create(CreateOrderCommand command);  
    void paySuccess(PaySuccessCommand command);  
}
2.3.2. 使用 Order Command 控制器

输入 http://127.0.0.1:8080/swagger-ui/ 访问 swagger 界面,发现新增一组 Controller。

OrderCommandService 服务中的所有方法全部出现在 Controller 中。

首先,展开 CommandByBody 中的 create 方法,可见:

然后,展开 CommandByParam 中的 create 方法,具体如下:

整体结构和手写 Controller 基本一致,所暴露的功能也全部相同。

2.4. Query 控制器

2.4.1. 启用 Query 控制器

OrderQueryService 接口上增加 @AutoRegisterWebController 注解,将其对外暴露为 Web 端口。

@QueryServiceDefinition(domainClass = Order.class,  
        repositoryClass = OrderQueryRepository.class)  
@Validated  
@AutoRegisterWebController(name = "order")  
public interface OrderQueryService {  
    OrderDetail getById(@Valid @NotNull(message = "订单号不能为null") Long id);  
    Page<OrderDetail> pageByUserId(@Valid @NotNull(message = "查询参数不能为 null") PageByUserId query);  
    List<OrderDetail> getByUserId(@Valid @NotNull(message = "查询参数不能为 null") GetByUserId getByUserId);  
    Long countByUser(@Valid @NotNull(message = "查询参数不能为 null") CountByUserId countByUserId);  
    List<OrderDetail> getPaidByUserId(Long id);  
}
2.3.2. 使用 Order Query 控制器

输入 http://127.0.0.1:8080/swagger-ui/ 访问 swagger 界面,发现新增一组 Controller。

OrderQueryService 服务中的所有方法全部出现在 Controller。

首先,展开 QueryByBody 中的 pageByUserId 方法,可见:

然后,展开 QueryByParam 中的 pageByUserId 方法,具体如下:

入参与返回值结构非常清晰,整体结构和手写 Controller 基本一致,所暴露的功能也全部相同。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

3. 设计&扩展

整个设计分为两部分:

  1. 提供统一的Controller,作为所有请求的转发器;
  2. 提供插件与 Swagger 进行集成,提供完整的 api doc;

3.1. 统一 Controller

提供 QueryDispatcherController 作为所有查询请求的入口,核心架构如下:

初始化流程如下:

  1. Spring 对所有的 QueryService 进行实例化;
  2. 完成实例化的 QueryService Bean 自动注册到 QueryServicesRegistry
  3. QueryMethodRegistryQueryServicesRegistry 中获取服务实例,对 QueryMethod 进行解析,并完成注册;

执行流程如下:

  1. 客户端向服务器发起请求;
  2. 服务器将请求 路由到 QueryDispatcherController 的相关方法;
  3. QueryDispatcherController 根据 serviceName 和 methodName 从 QueryMethodRegistry 中获取 QueryMethod,执行业务方法,最后返回最终结果;

3.2. 与 Swagger 集成

提供 QueryServicesProvider 与 Swagger 进行集成,提供完整的 api doc,整体设计如下:

QueryServiceProviderQueryDispatcherController 一致,同样依赖于 QueryMethodRegistry 中的 QueryMethod 信息。

核心流程如下:

  1. QueryServicesProviderQueryMethodRegistry 中获取 QueryMethod 信息;
  2. 解析 QueryMethod 信息生成 RequestHander,并注册到 Swagger ;
  3. 用户请求 Swagger 时,将 RequestHander 转化为 api doc进行返回;

4. 项目信息


相关文章
|
监控 druid Java
Spring Boot 3 集成 Druid 连接池详解
在现代的Java应用中,使用一个高效可靠的数据源是至关重要的。Druid连接池作为一款强大的数据库连接池,提供了丰富的监控和管理功能,成为很多Java项目的首选。本文将详细介绍如何在Spring Boot 3项目中配置数据源,集成Druid连接池,以实现更高效的数据库连接管理。
13552 2
Spring Boot 3 集成 Druid 连接池详解
|
机器学习/深度学习 编解码 测试技术
【YOLOv10改进-注意力机制】LSKNet(Large Selective Kernel Network ):空间选择注意力
YOLOv10专栏聚焦遥感目标检测,提出LSKNet,首个探索大型选择性核的模型。LSKNet利用LSKblock Attention动态调整感受野,处理不同目标的上下文。创新点还包括极化滤波和增强技术,提升信息保留和非线性输出。在HRSC2016等遥感基准上取得SOTA性能。LSKNet代码展示其网络结构,包括多阶段模块和注意力机制。详细配置和任务说明见相关链接。
|
存储 Java Apache
【maven】maven下载、安装与配置详细教程
【maven】maven下载、安装与配置详细教程
6354 1
|
SQL 前端开发 Java
Spring的三层架构
Spring MVC 三层架构(表现层、业务层、数据访问层)通过职责分离提升代码可维护性与扩展性。表现层(Controller)接收请求并返回响应;业务层(Service)处理核心逻辑与事务;数据访问层(Mapper)负责数据库操作与数据映射,共同实现高效、清晰的系统开发。
1665 0
|
IDE Java 开发工具
解决IntelliJ IDEA报错Error:Cannot determine path to ‘tools.jar‘ library for 17 (D:/JAVA)
解决IntelliJ IDEA报错Error:Cannot determine path to ‘tools.jar‘ library for 17 (D:/JAVA)
2857 1
|
网络协议 Windows
【IntelliJ IDEA】idea plugins搜索不出来,如何找到插件的解决方案
【IntelliJ IDEA】idea plugins搜索不出来,如何找到插件的解决方案
18673 1
|
机器学习/深度学习 计算机视觉
【YOLOv11改进 - 注意力机制】 MSDA(Multi-Scale Dilated Attention):多尺度空洞注意力
【YOLOv11改进 - 注意力机制】 MSDA(Multi-Scale Dilated Attention):多尺度空洞注意力本文介绍了一种高效的视觉变换器——DilateFormer,通过多尺度扩张注意力(MSDA)模块,在保持高性能的同时显著降低计算成本。MSDA通过在滑动窗口内模拟局部和稀疏的块交互,实现了多尺度特征聚合。实验结果显示,DilateFormer在ImageNet-1K分类、COCO对象检测/实例分割和ADE20K语义分割任务上均取得了优异的性能,且计算成本比现有模型减少70%。
【YOLOv11改进 - 注意力机制】 MSDA(Multi-Scale Dilated Attention):多尺度空洞注意力
|
测试技术 程序员 开发工具
Git 最佳实践:分支管理
5月份,为统一团队git分支管理规范,刚开始准备自己写,在网上搜了下,发现不少不错的git分支管理实践。最后我为团队选择了这个git分支管理实践 A successful Git branching model ,网上有不少参考这篇文章写的中文版gitflow实践,推荐一个中文版的Git 最佳实践:分支管理。
17414 0
|
机器学习/深度学习 计算机视觉
【YOLOv10改进-注意力机制】 MSDA:多尺度空洞注意力 (论文笔记+引入代码)
YOLO目标检测专栏探讨了ViT的改进,提出DilateFormer,它结合多尺度扩张注意力(MSDA)来平衡计算效率和关注域大小。MSDA利用局部稀疏交互减少冗余,通过不同头部的扩张率捕获多尺度特征。DilateFormer在保持高性能的同时,计算成本降低70%,在ImageNet-1K、COCO和ADE20K任务上取得领先结果。YOLOv8引入了MultiDilatelocalAttention模块,用于实现膨胀注意力。更多详情及配置见相关链接。
|
计算机视觉
【YOLOv10改进-损失函数】Shape-IoU:考虑边框形状与尺度的指标
YOLO目标检测专栏探讨了边框回归损失的创新方法,强调了目标形状和尺度对结果的影响。提出的新方法Shape-IoU关注边框自身属性,通过聚焦形状和尺度提高回归精度。实验显示,该方法提升了检测效果,超越现有技术,在多个任务中达到SOTA。论文和代码已公开。