一种基于ClassLoader实现定制开发的方法与流程

文档序号:11386201阅读:292来源:国知局

本发明属于java开发的技术领域,具体涉及一种基于classloader实现定制开发的方法。



背景技术:

classloader是用来动态加载class文件到虚拟机中的类加载器,当一个classloader加载一个class的时候,这个class所依赖的和引用的所有class也由这个classloader负责载入。classloader加载类的过程包括:(1)找到.class文件并把这个文件加载到内存中;(2)字节码验证,class类数据结构分析,内存分配和符号表的链接;(3)类中静态属性和初始化赋值以及静态代码块的执行。

大部分电子商务平台上的产品规划、设计和实现主要是为了满足多数企业的通用的需求,没有处理各个企业在细节上一些业务操作或流程上的区别,为了满足这样的情况,就需要根据客户的要求对业务进行定制,但基于一个j2ee项目的定制,涉及到表、页面、流程及业务逻辑的更改,其比较通行的做法是切分支开发并维护。但这样的缺点是特别明显:

(1)版本维护很复杂。一个定制客户就需要一个版本,客户越多,版本量越大!

(2)开发维护量会很庞大。如:产品新增功能、修复bug等共性代码维护时,这些分支版本的维护成本很成倍增加!

(3)测试与发布复杂。要针对不同客户获取对应的分支代码、打包、测试等等一整套过程,工作效率低下且容易出错。

针对不同细分行业的用户所提出的定制化需求,目前通常采取的办法有两种,其一是分支开发,其二是插件模式;所述分支开发,是指针对不同的企业用户专门开辟一个分支,并在这个分支上进行定制化开发;但随着企业数量增加,分支逐渐增多,无疑将给后期的维护、升级等带来极为庞大的开销成本;所述插件开发,主要包含基于脚本等动态解释语言和基于特定插件接口进行扩展,前者主要利用脚本语言动态解释执行的能力,由于脚本语言不需要编译,因而无需提前构造类型,只需在每次调用时动态解释执行,对于开发展来说调整程序逻辑比较方便,但程序执行效率差,近适用于扩展需求不复杂的场景中;后者支持较复杂的业务逻辑,一般是编写一些遵循了某些特定规则的组件,主程序在启动或执行特定业务逻辑时通过静态调用或反射等方式装载该组件中的类型并执行相应代码,将暴露的扩展接口在内存中的地址传给组件,组件则根据这些地址来调用插件接口,从而实现对主程序功能的增强。插件开发是目前运用较多的一种方式,但受限于只能在原有的服务接口和插件接口基础上新增功能,不能改变原有的功能,只能被视为附加品。

为解决因满足不断更新的业务需求而做出的程序频繁修改,专利“基于预加载机制的插件支持方法”(申请号:201510136737.0)有了新的突破,包括以下步骤:1、主程序启动并加载插件运行框架,由插件运行框架负责读取外部插件;2、插件运行框架为外部插件启动独立类加载器,类加载器加载插件中的类型,并将类型保存到全局缓存中;3、插件运行框架获取主程序当前的类加载器,将主程序当前类的加载器的父加载器替换为原父加载器的代理类,原父加载器的代理类会拦截所有发给原始类加载器的类型加载调用;4、当主程序请求调用class类型时,按照类型名称先从原父加载器中查找class类型,若没有找到目标类型,再从全局缓存中匹配是否有对应的插件提供的类型,若匹配成功,则直接加载执行,反之,则抛出异常;然而,该专利仅是通过补充式的机制,以不断新增功能的方式满足新需求,虽然能应对定制性开发,但是兼容性和程序替换的稳定性都没有综合考虑。j2ee是一套新的java技术架构,包含许多组件,主要可简化且规范应用系统的开发与部署,进而提高可移植性、安全与再用价值。j2ee核心是一组技术规范与指南,其中所包含的各类组件、服务架构及技术层次,均有共同的标准及规格,让各种依循j2ee架构的不同平台之间,存在良好的兼容性。



技术实现要素:

为解决现有技术存在的局限性,本发明的目的是,在通用系统或页面存在的前提下,针对每个用户的个性化需求设置单独的开发项目,并利用classloader逐个加载定制化项目中的定制类,通过底层代码自动更换的方式,对原有页面或原有的系统功能进行覆盖式替换,采用j2ee架构,实现最小成本的定制化开发。

本发明的技术方案是:一种基于classloader实现定制开发的方法,电子商务平台上的产品设计和实现基于j2ee架构的项目的定制,具体步骤包括:

步骤1:电子商务平台上按照个性化需求新创建j2ee架构的项目:在通用系统或页面存在的前提下,针对每一个个性化需求,分别建立新的独立的j2ee架构的项目;新j2ee架构的项目需要开发依赖于有定制开发需求的原j2ee架构的项目;

按照定制的业务逻辑构建定制类,并将定制类放置在新j2ee架构的项目中,并根据业务需求选择是否继承原有的类,同时对定制类进行标示;特别地,新j2ee架构的项目的开发依赖是指在开发阶段依赖,其他阶段都不依赖;其中,所述开发依赖,是maven项目的一种依赖状态,是指在开发阶段依赖,其它阶段都不依赖的行为,也就是打包之后不会有这个依赖的内容。

步骤2:编制步骤1中的新建项目:针对新j2ee架构的项目中有定制需求的静态资源,涉及到包括页面、图片、网页样式css、网页设计js在内的与web项目相关的静态资源,静态资源由静态文件描述,新j2ee架构的项目中静态文件的路径和名称应保持与原j2ee架构的项目中静态文件的路径和名称一致;

在所述静态文件里,标明了实现定制的业务内容;

步骤3:将新j2ee架构的项目打包成war包,并将该war包发布到应用服务器上,同时变更该war包的后缀名为plg或其他任意一种文件后缀,以区分新新项目war包和原项目war包,并将新项目war包放在业务war包文件夹中;

所述业务包文件夹是用于存放某一个应用系统所涵盖的全部业务功能的实现包;

步骤4:启动自定义的监听器listener,当应用服务器启动后,针对步骤3中已存入应用服务器中的定制war包由监听器listener扫描定制war包中所有标注为“定制标识”的定制类,同时在内存中记录定制类与其在原系统中相对应的类之间的匹配关系;

步骤5:当应用开始加载业务war包中的类时,利用预编制的classloader加载器首先加载定制war包中的静态资源;如果定制war包中没有与业务功能匹配的静态资源,则加载原项目war包中的静态资源;

步骤6:在classloader加载业务war包中的类时,根据步骤4中建立的定制类与原类间的对应关系,当加载的原类是存在被定制关系的,则加载完原类后继续加载匹配的定制类,并返回定制类的结果,实现基于底层代码更替的功能定制化;

本发明有益效果:(1)本发明通过利用classloader加载机制,从底层替换程序代码的方式修改、增加、甚至删除原通用系统中的功能及业务流程,而变更为满足个性化需求的系统功能,减少定制化开发项目过程中的冗余代码,有效地降低开发量和维护量;(2)本发明通过针对每个用户的个性化需求设置单独的开发项目,使每个定制用户就是一个微型项目,代码管理方式就像插件一样,很方便于产品正常规划与升级等操作,实现更加灵活的开发方式。

附图说明

图1为本发明实施例中一种基于classloader实现定制开发的流程示意图。

具体实施例

为了让本技术领域的人能够更好的理解本申请实例中的技术方案,下面结合附图对本申请实施中的本发明的技术方案做进一步的说明。

图1为本发明实施例中一种基于classloader实现定制开发的流程示意图,具体流程包括:

步骤101:基于现有的通用系统或页面存在的,根据每个用户的个性化需求,定制开发独立的j2ee项目,并按照定制的业务逻辑构建定制类,并将定制类放置在新j2ee项目中,并根据业务需求选择是否继承原有的类,同时对定制类以“注解@aepscustomize”做标识;

步骤102:针对步骤1中新建j2ee项目中有定制需求的静态资源,涉及到包括页面、图片、网页样式css、网页设计js在内的与web项目相关的静态资源,静态资源由静态文件描述,新j2ee项目中静态文件的路径和名称应保持与原项目中静态文件的路径和名称一致;

步骤103:将新j2ee项目打包成war包,并将该war包发布到应用服务器上,同时变更该war包的后缀名为plg或其他任意一种文件后缀,以区分新新项目war包和原项目war包,并将新项目war包放在业务war包所在的文件夹中;

步骤104:编制并启动监听器listener,当应用服务器启动后,针对步骤3中已存入应用服务器中的定制war包由监听器listener扫描定制war包中所有标注为“注解@aepscustomize”的定制类,同时在内存中记录定制类与其在原系统中相对应的类之间的匹配关系;

步骤105:当应用开始加载业务war包中的类时,利用预编制的classloader加载器首先加载定制war包中的静态资源;如果定制war包中没有与业务功能匹配的静态资源,则执行步骤106:加载原项目war包中的静态资源;

步骤107:在classloader加载业war包中的类时,根据步骤4中建立的定制类与原类间的对应关系,当加载的原类是存在被定制关系的,则加载完原类后继续加载匹配的定制类,并返回定制类的结果,实现基于底层代码更替的功能定制化。

以上所述仅为本发明的实施例,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均以包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1