点击上方“程序员蜗牛g”,选择“设为星标”跟蜗牛哥一起,每天进步一点点

程序员蜗牛g大厂程序员一枚 跟蜗牛一起 每天进步一点点31篇原创内容公众号
一、背景
项目中有一个 OpenApi 接口提供给客户(上游系统)调用。
这个接口中包含十几个功能点,比如:入参校验、系统配置校验、基本数据入库、核心数据入库、发送给消息中心、发送给 MQ...
不同的客户对这个接口的要求也不同,有些功能不需要,有些需要添加特定功能。
二、思路
- 基于以上背景,考虑把十几个功能点进行拆分形成独立的功能。因此使用责任链模式实现。
- 创建一个抽象类(
ComponentAbstract.java),每个拆分功能点继承抽象类形成子类。 - 子类创建时,需要在
@Component("1")注解中设置类名,如果不设置咋使用默认的(小驼峰)名称 - 子类之间的数据通信使用自定义的上下文类(
Contxt.java)子类中可以对上下文数据进行修改。(业务解耦) - 通过事先定义好的执行顺序,通过 spring 的上下文
ApplicationContext根据子类名称循环获取子类对象,执行抽象类中handlerRequest()方法。 - “事先定义好的执行顺序”,可以保存到数据库中项目启动的时候加载到内存,或者直接维护到Redis中。我这边直接使用接口进行演示:
http://localhost:8082/test/chain?index=2,1,3,4
三、代码
maven依赖,没有特别的依赖fastjson用于测试时打印日志
ComponentAbstract.java 抽象类实现责任链的基础
Test1.java 业务类1,继承抽象类实现doHandler()方法,在@Component中设置类名1
Test2.java 业务类2,继承抽象类实现doHandler()方法,在@Component中设置类名2
Test3.java 业务类3,继承抽象类实现doHandler()方法,在@Component中设置类名3
Test4.java 业务类4,继承抽象类实现doHandler()方法,在@Component中设置类名4
Contxt.java 业务上下文,用于每个子类(每个功能点)之间的数据通信。
需要什么数据可以在此类中添加字段进行写入,后面执行的类可以读取。
AopProxyUtils.java spring 管理的上下文,用于根据类名获取类实体。
LiteFlowController.java 用于测试,演示如何动态编排。
调用接口http://localhost:8082/test/chain?index=2,1,3,4 传入不同的index顺序,业务逻辑中执行的顺序也不同。
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。
关注公众号:woniuxgg,在公众号中回复:笔记 就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!
所有评论(0)