有没有时候,有些差异化的补丁实在是打不上?用AOP、全局事件又觉得太重。实在是有些面你真是切不动,切的多了业务也容易紊乱。这里今天就来个差异化执行的方案,希望可以帮助到大家,开拓思路。
一、项目情况
我这里是遇到一个完整的闭环业务,需要给第三方也推送一份数据,就是数据要做下差异化操作,实际跟我们的业务没有半点关系。
我这里已经定位到业务流程的切入点(代码位置),但是呢,只有这个公司、这个项目是这样差异处理。前面的业务是一样的,不想跟这个单独开一个方法。因为我这里也是收到上级系统的推送数据,然后再推送给这个第三方(客户的另一个系统)。
二、思路
不想太重,所以我这里自行设置一个可随时修改配置的设计。具体思路如下:
1、配置反射信息、业务信息
2、利用反射调用,对业务信息、判断走不同的逻辑方法(补丁方法)
3、在不同逻辑方法中,对入参进行类型转换,执行个性化逻辑
三、配置表设计

CREATE TABLE `sys_expand_config` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',`org_id` int(11) DEFAULT NULL COMMENT '公司id',`subject_id` int(11) DEFAULT NULL COMMENT '项目id',`expand_point` varchar(10) DEFAULT NULL COMMENT '扩展点,push接收推送数据时',`expand_method` varchar(400) DEFAULT NULL COMMENT '扩展方法',`expand_method_name` varchar(500) DEFAULT NULL COMMENT '扩展方法名称',`create_by` int(11) DEFAULT NULL COMMENT '创建人',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_by` int(11) DEFAULT NULL COMMENT '更新人',`update_time` datetime DEFAULT NULL COMMENT '更新时间',`is_deleted` int(2) DEFAULT NULL COMMENT '是否删除,0否,1是',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;

关键字段解释:
org_id\subject_id:用于针对不同公司、项目做差异化扩展
expand_method:扩展方法,我这里其实是固定的
expand_point:扩展点,这个才是我这里用于业务判断走不同逻辑(补丁)方法的标识
配置数据:

INSERT INTO `sys_expand_config` (`id`, `org_id`, `subject_id`, `expand_point`, `expand_method`, `expand_method_name`, `create_by`, `create_time`, `update_by`, `update_time`, `is_deleted`) VALUES (1, 62, 280, 'zyPushData', 'execute', '扩展推送给xx第三方', 1, '2021-08-25 16:56:59', NULL, NULL, 0);

四、整体代码
入参对象:
用抽象对象T,保证各业务在切入时设置参数

/*** @author zhengwen**/
@Data
public class SysExpandConfigVo<T> {private SysExpandConfig sysExpandConfig;private T data;
}

切入点:

//20210825增加:获取公司项目的扩展方法执行
SysExpandConfigVo vo = new SysExpandConfigVo();
SysExpandConfig sysExpandConfig = new SysExpandConfig();
sysExpandConfig.setOrgId(deviceInfo.getOrgId());
sysExpandConfig.setSubjectId(deviceInfo.getSubjectId());
vo.setSysExpandConfig(sysExpandConfig);
vo.setData(deviceRecord);
sysExpandConfigService.executeExpand(vo);

查询扩展配置设置执行调用:

@Override
@Async
public Result<?> executeExpand(SysExpandConfigVo record) {AtomicReference<Result<?>> res = new AtomicReference<>(ResultGenerator.genSuccessResult());if (record != null) {SysExpandConfig sysExpandConfig = record.getSysExpandConfig();sysExpandConfig.setIsDeleted(Constant.NO_DELETE);List<SysExpandConfig> expandConfigList = sysExpandConfigMapper.select(sysExpandConfig);if (CollectionUtil.isNotEmpty(expandConfigList)) {expandConfigList.stream().forEach(c -> {SysExpandConfigVo exVo = new SysExpandConfigVo();exVo.setSysExpandConfig(c);exVo.setData(record.getData());Result<?> exRes = goDoExecuteExpand(exVo);if (exRes != null && exRes.getCode() != ResultCode.SUCCESS.code()) {res.set(exRes);}});}}return res.get();
}

这里因为跟原先业务没有关系,所以开开启线程执行,大家可以根据情况。
反射调用:

/*** @param exVo* @return*/
private Result<?> goDoExecuteExpand(SysExpandConfigVo exVo) {SysExpandConfig sysExpandConfig = exVo.getSysExpandConfig();String methodName = sysExpandConfig.getExpandMethod(); //与expand_method配置一致//加载类Class<?> controllerClass = null;try {//包名,专门的一个类写扩展补丁方法,方便管理controllerClass = Class.forName("com.xxx.web.controller.SysExpandController");//获取方法Method controllerMethod = controllerClass.getMethod(methodName, SysExpandConfigVo.class);//调用Object resObj = controllerMethod.invoke(controllerClass.newInstance(), exVo);Result<?> res = null;if (resObj == null) {log.info("--扩展执行返回空--");} else {res = (Result<?>) resObj;}log.info("---公司id:{},项目id:{},方法:{},时间[{}]扩展正常执行", sysExpandConfig.getOrgId(), sysExpandConfig.getSubjectId(), methodName, DateUtil.getCurrentDateTime());return res;} catch (Exception e) {log.error("---扩展执行异常:{}", e.getMessage(), e);return ResultGenerator.genFailResult("扩展执行异常");}}

业务差异分支方法:

@Override
public Result<?> execute(SysExpandConfigVo expandConfigVo) {SysExpandConfig expandConfig = expandConfigVo.getSysExpandConfig();if (expandConfig != null) {String expandPoint = expandConfig.getExpandPoint();if (StringUtils.isNotBlank(expandPoint)) {switch (expandPoint) {case "zyPushData":  //与配置的expand_point一致//真正的补丁逻辑方法zyPushData(expandConfigVo);break;default:break;}}}return ResultGenerator.genFailResult("扩展配置信息入参为空");
}

业务逻辑补丁方法:

/*** 给第三方xx推送数据** @param expandConfigVo 扩展配置入参vo* @return 统一出参*/
private Result<?> zyPushData(SysExpandConfigVo expandConfigVo) {SysExpandConfig expandConfig = expandConfigVo.getSysExpandConfig();//获取入参对象Object data = expandConfigVo.getData();//执行转换,转换逻辑就是利用json工具类转json字符串为对象等等DeviceSensirionRecord record = SysExpandUtil.converToSensirionRecord(data);//TODO 写你的补丁逻辑return ResultGenerator.genSuccessResult();
}

五、效果
从切入点能进自己的业务补丁逻辑方法就ok了。
六、总结
水无形,山无势。山水没有固定的形势,我们能使用一些手段实现自己的逻辑就行。这里就是利用反射调用,传递抽象参数对象到真正的业务补丁方法,然后对象转换。最后开始自己的补丁逻辑。
要坚信切面的姿势很多,可以自行设计。就写到这里,希望可以启发大家。

没有打不了的补丁切不了的面相关推荐

  1. Java逆向基础之简单的补丁

    本文参考:http://www.vuln.cn/7118 本文参考:<Reverse Engineering for Beginners>Dennis Yurichev著 本文需要用到ID ...

  2. DIV+CSS 之 网页切图过程中div+css命名规则

    网页切图过程中div+css命名规则 内容:content/container 导航:nav 侧栏:sidebar 栏目:column 标志:logo 页面主体:main 广告:banner 热点:h ...

  3. 关于联想小新Air14(或小新系列)更新系统后蓝屏的解决方法(关于windows系统更新安装补丁后出现蓝屏的解决方法)

    关于 一.前言 作者在某天更新完windows10系统后,连续两天出现电脑卡机,接而出现蓝屏.出现的很突然,让我很是头疼,咨询联想客服,联想客服首次提供的解决方法是卸载最新的质量更新(读者可点击,按教 ...

  4. 补丁问题(WannaCry)补丁问题

    5月12日,全球爆发的勒索病毒WannaCry借助高危漏洞"永恒之蓝"(EternalBlue)在世界范围内爆发,据报道包括美国.英国.中国.俄罗斯.西班牙.意大利.越南等百余个国 ...

  5. Resolume Avenue 6 for Mac破解版永久激活方法附破解补丁

    Resolume Avenue 6 for Mac是一款Mac平台上专业的VJ软件,可以帮助用户在现场完成音频的调试.Resolume Avenue 6版本全新升级提供了一个专业舞台音效处理的平台,支 ...

  6. RAD Studio破解补丁合集(2018.12.25)

    免责申明: 所有破解补丁均来自于网络,本人只负责收集整理,供大家测试研究之用.不提供相应的产品技术支持和服务. 本破解补丁合集只可用于个人测试研究之用,切勿用于商业用途,请在使用后的24小时内删除本破 ...

  7. JS中文排序(Ext中文排序补丁)

    1.浏览器中文比较  if(typeof(v1) == "string"&&/.*[\u4e00-\u9fa5]+.*$/.test(v1)){ //若为中文字符串 ...

  8. 3D劲舞游戏 Dance Mixer 简体中文汉化版+常见问题(更新1.1补丁 汉化) 1

    汉化补丁和下载 3D劲舞游戏Dance Mixer 游戏名称: Dance Mixer 类型:   音乐+舞台+动作编辑 发售日期: 2009.6.26 公司:   project Dance 官网: ...

  9. 一键实现打release包 -> 360加固 -> 存档,并在后期一键实现针对某一版本生成Sophix补丁的gradle脚本

    最近升级项目把Bugly-Tinker换成了Sophix,因为使用了阿里的tlog服务,之前用Bugly的更新服务,现在也没有使用了,索性就把CrashReport和Hotfix都切过来吧,还有一点是 ...

最新文章

  1. [云炬创业学笔记]第三章商业创意的发掘与评估测试5
  2. AbstractEndpoint 和 ProtocolHandler
  3. 高中生住校好还是走读好?为什么?
  4. 使用FileReader对象的readAsDataURL方法来读取图像文件
  5. python基础作业_017--python基础作业
  6. Luogu4587[FJOI2016] 神秘数
  7. zepto 操作 cookie
  8. 10的多少次方 oracle_Oracle SQL計算平方根、立方根、次方
  9. 基于python+django框架+Mysql数据库的旅游景区景点售票系统设计与实现
  10. Win10下配置PHP环境变量
  11. Unity学习场景、模型和粒子资源包,总有一款你能用到,亲测可使用,第一波来袭
  12. 关于word中插入的mathtype公式变形问题的解决方案
  13. ubuntu文本输入源,找不到中文拼音输入源
  14. 第7.5节 揭开Python类中self的面纱
  15. 一般柱子与柱子的距离_砖混结构柱子间距多少合适?分分钟了解透彻
  16. 前端实现在线预览、编辑Office文档(vue版)
  17. 【冷眼看CES2018】AI概念满天飞,大型吹牛集会可休矣
  18. [渝粤教育] 东北财经大学 财务管理 参考 资料
  19. Photoshop色彩模式完全手册
  20. 密码学系列之十:量子密码

热门文章

  1. JS语法之:require
  2. 水溶性花青素连接剂1617497-19-4,diSulfo-Cyanine5 alkyne,二磺酸花青素Cy5炔基
  3. 股票K线指标算法整理(Java封装工具类)
  4. spring事务管理tx:Advice详解
  5. 火狐Error 403 No valid crumb was included in the request并且浏览器一直是loading中
  6. android 启动视频,android 启动页面全屏播放视频
  7. 王阳明:越是多变时,越要学会进化(附个体进化的底层心力逻辑)
  8. 11月14日:jquery
  9. 经典光流估计算法和光流对齐方法
  10. 自我介绍一分钟范文(碎的)