📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍
文章目录
- 写在前面的话
- 背景技术
- 发明目的
- 具体方案
- 实施案例
- 特征描述
- 总结陈词
写在前面的话
本篇文章分享一下公司实战开发中关于《一种个性化逻辑定制与类置换方案》的方案说明。
推荐文章 - 程序猿入职必会:
《程序猿入职必会(1) · 搭建拥有数据交互的 SpringBoot 》
《程序猿入职必会(2) · 搭建具备前端展示效果的 Vue》
《程序猿入职必会(3) · SpringBoot 各层功能完善 》
《程序猿入职必会(4) · Vue 完成 CURD 案例 》
《程序猿入职必会(5) · CURD 页面细节规范 》
《程序猿入职必会(6) · 返回结果统一封装》
《程序猿入职必会(7) · 前端请求工具封装》
《程序猿入职必会(8) · 整合 Knife4j 接口文档》
《程序猿入职必会(9) · 用代码生成器快速开发》
《程序猿入职必会(10) · 整合 Redis(基础篇)》
《程序猿入职必会(11) · 整合 Redis 实战运用》
推荐文章 - 学会 SpringMVC 系列
《学会 SpringMVC 系列 · 基础篇》
《学会 SpringMVC 系列 · 剖析篇(上)》
《学会 SpringMVC 系列 · 剖析入参处理》
《学会 SpringMVC 系列 · 剖析出参处理》
《学会 SpringMVC 系列 · 返回值处理器》
《学会 SpringMVC 系列 · 消息转换器 MessageConverters》
《学会 SpringMVC 系列 · 写入拦截器 ResponseBodyAdvice》
《学会 SpringMVC 系列 · 剖析初始化》
《学会 SpringMVC 系列 · 参数解析器 ArgumentResolvers》
背景技术
在医疗软件信息行业中,通常不同医院的实际业务流程大相径庭,深究具体业务细节则差异化更加明显,因此,院内医疗信息化相关的业务系统往往无法做到只使用同一个版本,就可以满足或兼容所有医院或场景的需求。而这种情况对医疗信息化厂商而言,他们则需要投入更多的精力用于客户需求定制的满足上。
普遍的做法是针对复杂业务系统直接使用多个版本,不同医院或者某一区域内的医院采用独立的一个版本,这种方式优点是代码较清晰,但开发和维护成本将是成倍的增加。若不想使用多版本,通常的解决方案是通过指定医院级别的参数管理,不同参数执行不同的分支流程,但这将会让原有代码逻辑越来越臃肿,也容易产生逻辑异常。当然,也可以选择引入规则引擎或工作流引擎,以低耦合方式执行附加逻辑,但此举只适合于特定的流程类型场景。
无论上述哪种方式,在灵活性和细化程度上都受到限制,同时,为了达到定制需求的目的,所投入的管理成本也将相对较高。如何解决上述问题,输出一套定制程度高、代码灵活性高、管理成本低的个性化定制解决方案,是一个难题。
发明目的
本方案发明目的旨在提供一套适用于个性化定制程度较高的信息化场景的解决方案。支持通过灵活的可视化配置方式,进行附加业务逻辑的定义、调整、组合等操作。支持执行内部代码方法、执行SQL语法段、触发HTTP请求、全类逻辑替换后执行等多种逻辑类型。支持接入方系统通过面向切面、手动埋点、全类替换等多种方式进行附加逻辑的接入。
引入该个性化逻辑定制和类置换方案后,业务系统可以灵活的根据自己实际需要,在合适的位置执行合适的逻辑,同时新产品上线时,可以用全局一览的方式进行附加逻辑和流程节点定制,轻松应对各种个性化定制需求场景
具体方案
本方案独立于具体业务系统与数据结构,旨在提供一套定制程度高、代码灵活性高、管理成本低的个性化定制问题解决方案,分为三个核心模块:可视化逻辑配置、附加逻辑接入、附加逻辑执行。
可视化逻辑配置
1、支持通过可视化逻辑配置界面,定义业务所需的附加业务逻辑,逻辑可选类型包含但不限于执行SQL语法段、触发HTTP请求、执行内部代码方法、全类逻辑替换等,不同类型逻辑有不同的配置信息和属性结构;
2、附加业务逻辑,可以单独存在,也可以使用拖拽的方式进行组合,从而形成附加逻辑组,组合内的附加业务逻辑支持优先级排序、共享全局变量、出入参衔接等特性。同时,组合后的附加逻辑组,其具体行为等同于单个附加逻辑;
3、附加业务逻辑,支持出入参定制修改,入参可以应用在附加逻辑的各个位置,利用正则表达式替换,允许添加入参校验,也允许利用变量配置进行入参二次转换。出参支持格式化、节点重命名等返回前拦截修改的特性;
4、附加业务逻辑,还支持指定生效代码范畴、指定触发前置条件、异常处理逻辑配置等高级属性;
5、配置页面支持按场景绑定附加业务逻辑或组合逻辑,支持按场景进行最小化配置业务逻辑,同时支持灵活开关和模板复用;
附加逻辑的接入
本方案基于AOP、监听器、拦截器、动态代理、反射机制、自定义注解、自定义类加载器等技术实现。将定义好的附加逻辑,根据预绑定的接入规则,允许接入方采用选择相对应的方式接入。
常见接入方式包含但不限于如下模式:
1、支持以面向切面方式(AOP),被动触发附加业务逻辑
接入方只需要在类或者方法上添加相应的预置注解,由本方案在指定的触发时机主动触发相应附加逻辑,不需要接入方改动业务内部逻辑。触发时机包含不限于前置附加、后置附加、环绕包裹附加、返回结果后抛出异常后附加等方式。
本模式的特点是:面向切面、低耦合、低侵入,适合大范围添加公用逻辑,常用于日志记录、事务管理、权限验证、性能监测等。
2、支持以手动代码埋点()的方式,主动触发附加业务逻辑
接入方只需要在想要执行附加逻辑的具体的代码行,添加相应埋点,当执行到此代码行时,将执行附加业务逻辑。埋点可以是预置的Client工具类、注入Bean操作或者标准HTTP模式。
本模式的特点是:更加灵活的选择触发时机,入参自由组合,出参自由操作,适用范围较广。
3、支持以类置换()的方式,将原逻辑替换为附加业务逻辑
该模式通过将附加逻辑绑定到全类置换的方式,在线可视化编辑代码,生成CLASS文件,并根据全限定类名,进行逻辑替换。本模式不需要添加注册和手动埋点,项目初始化监听器中,直接通过JVM类加载器,动态加载编辑后的类文件,实现逻辑替换,对接入方是无感的。
本模式的特点是:全类逻辑替换,适合逻辑需要大幅度变更的场景。
附加逻辑的执行
在接入方完成附加逻辑的接入后,将根据接入规则不同,在项目运行的合适时机,进行附加逻辑的执行。
本方案的执行根据逻辑类型,包含但不限于如下方式:
1、执行接入方内部代码
该附加规则在定义时,通过指定接入方某逻辑的全限定类名+方法,绑定了具体执行内容。
当符合指定的触发时机时,本专利方案将通过反射机制,在程序运行时,得到该附加逻辑对应的类和方法,同时创建对象并执行相应的方法。
2、执行SQL语法段
该附加规则在定义时,通过维护原生SQL或Mybatis动态SQL内容,并指定执行数据源。
当符合指定的触发时机时,本专利方案将先切换数据源,然后针对附加语法配置和参数信息,完成语法解析和替换,最终执行获得结果。
3、触发远程调用请求
该附加规则在定义时,通过指定需要调用的远程地址,并指定请求类型是HTTP或WebService,同时预定义了参数、请求头、以及其他远程调用额外属性。
当符合触发时机后,本专利方案将读取远程调用请求的配置,选择相应的远程请求工具,完成远程调用请求。
4、全类逻辑替换:通过JVM类加载器,动态加载类文件,实现逻辑代码替换,替换后的类,按正常方式调用与执行,即可在运行时将默认逻辑改为线上编辑后的版本。
实施案例
案例1:后置附加逻辑执行接入方内部代码的场景
某个性化定制需求,要求若干业务接口在完成逻辑操作后,需要调用一段内部的公用代码,如何在不改变代码的情况下满足这一需要。
具体步骤如下:
1、在个性化定制平台预定义一个附加逻辑,其类型是”执行接入方内部代码“,指定接入方某逻辑的全限定类名和方法信息,并按需配置该附加逻辑的出入参以及其他高级属性;
2、原业务逻辑只需要在方法上,添加相应注解标识即可,不需要改动其他代码,也可以通过配置平台指定该附加逻辑的生效范畴;
3、本方案将在项目初始化监听器中,以扫描业务代码注解或读取附加逻辑生效范畴等方式,将代码逻辑和附加逻辑以合适的触发时机绑定;
4、当业务代码执行完毕后,将自动触发附加逻辑,该附加逻辑将读取全限定类名+方法,并利用反射机制,创建对象并执行相应的方法,最终达到个性化定制目的。
案例2:全类逻辑置换后执行的场景
某个性化定制需求,要求某业务逻辑代码,直接根据该需求进行定制开发,而不采用分支判断的方式。
具体步骤如下:
1、在个性化定制平台预定义一个附加逻辑,其类型是”全类逻辑替换后执行“,指定需要替换类的全限定类名等信息,线上编辑类的具体代码,但要与原类保持结构一致;
2、原业务逻辑在调用涉及到个性化定制操作的类时,需要使用提供的客户端工具类发起调用,原操作对象作为参数传递;
3、本方案在项目初始化监听器中,将读取类型为”全类逻辑替换后执行“的附加逻辑,根据全限定类名的等信息,对此类型客户端工具类发起的交互做出动态代理操作;
4、执行时,通过自定义类加载器,动态加载编辑后类文件,然后利用反射机制,完成逻辑操作;
特征描述
1.本方案提供一套适用于个性化定制程度较高的信息化场景的解决方案,支持通过灵活的可视化配置方式,进行附加业务逻辑的定义、调整、组合等操作,轻松应对各种个性化定制需求场景;
2、本方案支持多种附加逻辑接入方案,包含但不限于面向切面、手动埋点、全类替换等;
3、本方案支持多种附加逻辑类型,包含但不限于执行内部代码方法、执行SQL语法段、触发HTTP请求、全类逻辑替换后执行等;
总结陈词
💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。