对开源软件修改的一些思考和总结

本文介绍了一种在不影响后续开源框架升级的前提下进行二次开发的方法。采用Spring AOP结合代理模式,通过对现有开源报表软件的定制化修改,既满足当前业务需求又保留了未来更新的可能性。

对开源软件修改的一些思考和总结

  1.为什么修改?

    公司需要开发一款基于web页面的报表应用,但是不能自己从零开发,要基于现有的开源框架进行二次开发或者如果开发框架能满足需求就不再进行二次开发。最后在github上找到一款基于java spring框架的报表软件,但是部分功能不满足目前的需求,需要进行二次开发。

  2.如何修改最合适?

    虽然进行二次开发,领导要求做到不能影响到后续的开源应用升级。也就是说,我们可以对源码进行二次开发,但是我们开发所做的修改不能影响到后续开源应用升级时代码的合入!这对于我们而言可就是有点难了,原因在于:我们要把这个源码的运行原理了解清楚已属不易,了解了原理之后要修改最快的方式当然是在源码中直接修改原有逻辑,但是要不影响升级,就需要一番巧妙的设计才行。

 3. 修改的实现!

  既然任务已经下达,我们就只有迎难而上了。在开发之前我先进行了一番思考了。第一,这类问题以前肯定有人遇到过,那么他们是怎么解决的?我想到了MyBatis开源框架中对于api接口实现查询的代理原理。就是一种典型的修改某个方法的实现逻辑,于是我明白了这就是java 设计模式中的代理模式。第二,代理的具体实现。我采用了最原始的xml配置的方式进行aop配置,生成切面,指定切点,生成around增强(因为要修改原有的逻辑),如果符合修改的条件就执行新的逻辑否则执行旧有逻辑。当然中间遇到一些问题更加加深了我对spring aop的认识。1.同一个类的实例的方法内再调用其他方法,不能出发代理。这时候就要修改aop的配置和源码的一些调用修改,aop的配置就是要将expose-proxy设置为true,然后在原先调用的地方改为AopContext.currentProxy()的方式。原因就是代理的是一个类的实例,如果不是通过该类的调用不会被代理的。通过以上配置就是会将代理类暴漏出去,然后直接使用代理类显性的调用方法。2.对于一些没有使用接口的类的方法的修改要将aop的配置改为proxy-target-class=true。原因是spring的aop底层实现有两种,一种是基于jdk的动态代理,一种是基于cglib的动态代理。两者的区别在于,前者适用于有接口实现的类的代理,后者可以代理那些没有接口实现的类的代理,因为后者是基于字节码框架,生成一个子类进而重写父类的方法。

4.总结

  当我们遇到一些开发的难题的时候,首先要想这个问题以前的人有没有遇到过,他们是怎么解决的,我能使用他们的方法解决我的问题吗?其次,要对源码进行学习,并想为什么源码要这么设计,有什么好处,有什么坏处,以后在什么情况下能用这个设计呢;最后,熟练掌握设计模式对于我们设计和开发中解决关键问题的架构是大有裨益的。

系统说明 TonyCode抽奖系统(前身《html+js抽奖系统》),由tony于2011年自身公司年会需要设计演变而来,从单机网页版本,逐步演变为基于WEB可执行程序的系列版本。系统适用于投影投射宴会、晚宴、活动等场景的互动抽奖,最新版本支持用手机端遥控进程,系统采用HTML及WEB前端、后端相关技术开发,作者用最简单的方式打包了exe自解压程序,内置的HTA客户端脚本来执行相关的代码程序。 建议使用时采用分屏模式运行程序,如果运行场所有网络的话,您可以选择结合手机等移动端扫描的形式来获取抽奖控制权限,这样可以有更好的互动体验。 当然安装部分杀毒软件的电脑有几率会杀掉相关程序,如果出现无法开启的情况,您关闭一下杀毒软件再运行。 功能描述: 1) 可以设置按照数字号码或名单列表抽取的方式,等级、数量全部可以自由定义 2) 连接投影机扩展屏幕后,再启动程序可以自动识别投放到扩展屏幕上全屏幕显示(建议投影分辨率1024*768) 3) 界面美观大方,背景图片及顶部公司logo自由替换为文字或图片,适合于投影仪投射晚会晚宴豪华场所抽奖系统。(图片自行设计宽度可以根据投影显示器,高度216像素,本例子参考如片“tops.png”) 4) 可自由选择键盘、鼠标、移动端扫描控制等操作方式完成抽奖控制。 5) 正常windows7及以上内核系统即可流畅运行,建议不要使用非常卡顿的电脑执行程序。 6) 抽出“未到场”无效人员可以双击“演示器”屏幕的数字或号码位置,选择单独 重抽。 7) 自由定义配置每一次操作抽一组或者抽一个的显示效果 8) 自由定义过滤掉没有发到的号码段,或排除不能中间的名额号段。 9) 系统运行期间程序活动状态,自动屏蔽键盘上无用键以免人员误操作。 10) 抽奖完成后可以选择保存结果“抽取结果.csv”以便日后备案分析。 历史版本概况: V1.2.1----------------------------------------------- 2011-01-08 修复了window.obo = 1;时出现重复数字的错误,V1.1之前版本无此错误 ~感谢石路街道的领导提醒:) 2011-01-08 增加了可选滚动姓名的功能 配置 m_name=[]; 即可 2011-01-08 增加双击数字单独重抽时的提示选项“此号码在以后的环节是否还有机会抽到!” 2011-01-08 修改了结果显示部分的错位样式 2011-01-08 修复了组抽号码重复错误问题 V1.2.2----------------------------------------------- 2011-01-14 兼容了火狐浏览器,但本人建议仍然用IE,要用火狐只有按F11手动全屏了 2011-01-14 部分键 F5、退格、Ctrl+R、Ctrl+N、Shift+F10、Alt+F4 被屏蔽,避免一些意外发生 2011-01-14 优化了一些繁琐的结构,效率有所提升! 2011-01-16 去掉了配置参数 r、r_name,奖项配置变为window.ini,使配合样式表更加灵活 V1.2.2----------------------------------------------- 2011-02-10 在配置文件增加了速度控制变量,以便于在不同机器环境中做速度微调 V1.2.3----------------------------------------------- 2011-08-10 政府项目《12315电视直播》抽奖使用未对外发布定制增强版本 V2.0----------------------------------------------- 2011-09-13 突破性的解决了手工修改代码烦恼增加了图形化界面 2011-09-13 可以通过图形化设置界面保存配置文件(只在IE下有效) 2011-09-13 配置文件从HTML内提取出来,变为ini.js 2011-09-13 图形化配置界面做了一些兼容性优化 2011-09-13 奖项框除了可以填写样式名还可以直接填写样式代码,程序可以自动识别 2011-09-13 增加了手动自动整理列表功能 V2.0.1----------------------------------------------- 2011-12-09 bug处理:列表获取处理错误,已修正! V2.0.2----------------------------------------------- 2011-12-31 bug处理:window.obo = 1;解决了不该有的错误提示!(未发布,直接发布下一版) V2.1----------------------------------------------- 2012-01-05 采用exe直接执行hta抛弃常见的浏览器模式,以免兼容性问题太多 V3.0-----------------------------------------------(终结版) 2017-1-23 修正了上一个版本的保存中间结果的bug问题,中奖结果直接保存到程序根目录 2017-1-23 修正了一次抽一个人的逻辑bug,增加作防范弊代码错误修正功能 2017-1-23 新增了保存配置文件是否下次跳过“引导页设置界面”选项,改进了保存等函数的效率及不兼容问题 2017-1-23 实现了扩展屏幕的自适应(存在扩展屏幕默认投放到扩展屏幕,否则就本地监视器显示) 2017-1-23 3.0版本把逻辑代码直接打包入了执行文件中,减少了冗余的文件数量 V4.0-----------------------------------------------(扩展屏幕移动控制板) 2017-04-10 增加了“扩展屏”奖项扩展控制器功能,原单屏版不受影响 2017-04-10 抽奖结果保存为“中奖结果.csv”文件,不再保存为原有的网页文件 2017-04-10 增加了移动端扫描二维码扫描进行遥控控制的基本进程控制功能 2017-04-10 对原有的逻辑文件做了全新打包精简掉一些不必要的冗余文件
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值