·设为首页收藏本站📧邮箱修改🎁免费下载专区💎积分✅卡密📒收藏夹👽聊天室
DZ插件网 门户 网站安全 查看内容

后端开挂!一个注解干翻所有Controller,太优雅了!

2024-8-31 10:43| 发布者: 独家记忆| 查看: 96854| 评论: 0

摘要: mall学习教程官网:macrozheng.com1. 概览日常开发中,最繁琐的便是编写 Controller。很多公司都制定了规范:Controller 不能存在任何的业务逻辑,主要完成参数解析和结果转换。不过查看项目源码,你会发现 Controll ...

后端开挂!一个注解干翻所有Controller,太优雅了!6681 作者: 来源: 发布时间:2024-8-31 10:43

mall学习教程官网:macrozheng.com

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,方便前端接入;

这或许是一个对你有用的开源项目,mall项目是一套基于 SpringBoot + Vue + uni-app 实现的电商系统(Github标星60K),采用Docker容器化部署,后端支持多模块和微服务架构。包括前台商城项目和后台管理系统,能支持完整的订单流程!涵盖商品、订单、购物车、权限、优惠券、会员、支付等功能!
  • Boot项目:https://github.com/macrozheng/mall
  • Cloud项目:https://github.com/macrozheng/mall-swarm
  • 视频教程:https://www.macrozheng.com/video/

后台管理系统演示:
后端开挂!一个注解干翻所有Controller,太优雅了!3234 作者: 来源: 发布时间:2024-8-31 10:43
前台商城项目演示:
后端开挂!一个注解干翻所有Controller,太优雅了!4919 作者: 来源: 发布时间:2024-8-31 10:43

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:

后端开挂!一个注解干翻所有Controller,太优雅了!3202 作者: 来源: 发布时间:2024-8-31 10:43

command-dispatcher-controller 是对 CommanderService 的Web暴露,主要用于执行写入和更新等业务操作,两个接入点包括:
  1. RequestBody 接入。以 json 作为入参,适用于复杂的参数结构;
  2. RequestParam 接入。以 param 作为参数,适用于简单场景;

后端开挂!一个注解干翻所有Controller,太优雅了!8733 作者: 来源: 发布时间:2024-8-31 10:43

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

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

后端开挂!一个注解干翻所有Controller,太优雅了!8788 作者: 来源: 发布时间:2024-8-31 10:43

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。

后端开挂!一个注解干翻所有Controller,太优雅了!9049 作者: 来源: 发布时间:2024-8-31 10:43

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

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

后端开挂!一个注解干翻所有Controller,太优雅了!9784 作者: 来源: 发布时间:2024-8-31 10:43

后端开挂!一个注解干翻所有Controller,太优雅了!1495 作者: 来源: 发布时间:2024-8-31 10:43

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

后端开挂!一个注解干翻所有Controller,太优雅了!2131 作者: 来源: 发布时间:2024-8-31 10:43

后端开挂!一个注解干翻所有Controller,太优雅了!3689 作者: 来源: 发布时间:2024-8-31 10:43

整体结构和手写 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。

后端开挂!一个注解干翻所有Controller,太优雅了!8735 作者: 来源: 发布时间:2024-8-31 10:43

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

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

后端开挂!一个注解干翻所有Controller,太优雅了!9543 作者: 来源: 发布时间:2024-8-31 10:43

后端开挂!一个注解干翻所有Controller,太优雅了!8859 作者: 来源: 发布时间:2024-8-31 10:43

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

后端开挂!一个注解干翻所有Controller,太优雅了!1610 作者: 来源: 发布时间:2024-8-31 10:43

后端开挂!一个注解干翻所有Controller,太优雅了!1027 作者: 来源: 发布时间:2024-8-31 10:43

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

3. 设计&扩展


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

3.1. 统一 Controller


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

后端开挂!一个注解干翻所有Controller,太优雅了!4089 作者: 来源: 发布时间:2024-8-31 10:43

初始化流程如下:
  1. Spring 对所有的 QueryService 进行实例化;
  2. 完成实例化的 QueryService Bean 自动注册到 QueryServicesRegistry;
  3. QueryMethodRegistry 从 QueryServicesRegistry 中获取服务实例,对 QueryMethod 进行解析,并完成注册;

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

3.2. 与 Swagger 集成


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

后端开挂!一个注解干翻所有Controller,太优雅了!1044 作者: 来源: 发布时间:2024-8-31 10:43

QueryServiceProvider 与 QueryDispatcherController 一致,同样依赖于 QueryMethodRegistry 中的 QueryMethod 信息。

核心流程如下:
  1. QueryServicesProvider 从 QueryMethodRegistry 中获取 QueryMethod 信息;
  2. 解析 QueryMethod 信息生成 RequestHander,并注册到 Swagger ;
  3. 用户请求 Swagger 时,将 RequestHander 转化为 api doc进行返回;

4. 项目信息


项目仓库地址:https://gitee.com/litao851025/lego

项目文档地址:https://gitee.com/litao851025/lego/wikis/support/web


Github上标星60K的电商实战项目mall,全套 视频教程(2023最新版) 已更新完毕!全套教程约40小时,共113期,通过这套教程你可以拥有一个涵盖主流Java技术栈的完整项目经验,同时提高自己独立开发一个项目的能力,下面是项目的整体架构图,感兴趣的小伙伴可以点击链接 mall视频教程 加入学习。

后端开挂!一个注解干翻所有Controller,太优雅了!9277 作者: 来源: 发布时间:2024-8-31 10:43

整套 视频教程 的内容还是非常完善的,涵盖了mall项目最佳学习路线、整体框架搭建、业务与技术实现全方位解析、线上Docker环境部署、微服务项目学习等内容,具体大纲可以参考下图,你也可以点击链接 mall视频教程 了解更多内容。

后端开挂!一个注解干翻所有Controller,太优雅了!3546 作者: 来源: 发布时间:2024-8-31 10:43

推荐阅读

  • 69K Star!这是我见过最强的开源电商系统 !!
  • Github标星60K!一套完整的项目实战教程来了,主流Java技术一网打尽!
  • 看了我项目中购物车、订单、支付一整套设计,同事也开始悄悄模仿了...
  • 订单系统就该这么设计,稳的一批!
  • 支付系统就该这么设计,稳的一批!
  • 权限系统就该这么设计,稳的一批!





上一篇:【云南招聘】云南汉盟制药有限公司招聘 15000元/月 五险一金!!
下一篇:腾讯云数据库亮相 DTC 2024,“国产化+智能化”双赛道驱动未来创新

鲜花

握手

雷人

路过

鸡蛋

评论

您需要登录后才可以发表言论 登录立即注册
创宇盾启航版免费网站防御网站加速服务
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:3.148.105.127,GMT+8, 2024-12-27 23:16 , Processed in 0.125612 second(s), 43 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2024 Discuz! Team.

关灯
扫一扫添加微信客服
QQ客服返回顶部
返回顶部