CN111190577B - 一种对工具包统一管理并实现轻量级mvc的框架构建方法 - Google Patents
一种对工具包统一管理并实现轻量级mvc的框架构建方法 Download PDFInfo
- Publication number
- CN111190577B CN111190577B CN201911315660.8A CN201911315660A CN111190577B CN 111190577 B CN111190577 B CN 111190577B CN 201911315660 A CN201911315660 A CN 201911315660A CN 111190577 B CN111190577 B CN 111190577B
- Authority
- CN
- China
- Prior art keywords
- module
- request
- database
- cache
- mvc
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/24—Object-oriented
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开一种对工具包统一管理并实现轻量级MVC的框架构建方法,包括三大模块分别为PLUGIN模块、SOA模块与PRODUCT模块;PLUGIN模块主要是面向功能的模块;所述SOA模块为替代spring、springMvc、Hibernate、myBatis的框架;所述PRODUCT模块为PLUGIN模块的升级,所述PRODUCT模块主要是面向业务,本框架的PLUGIN模块和PRODUCT模块可以有效的对第三方工具包做统一管理,实现了业务代码与工具包的完全解耦。而SOA‑MVC模块提供了更轻量级的操作,无论从用户的学习成本、用户的使用,还是后台实现逻辑,相比Spring、Hibernate、mybatis等,都会更加简单,从而一定程度上提高开发效率。
Description
技术领域
本发明涉及计算机软件编程技术领域,具体是涉及一种对工具包统一管理并实现轻量级MVC的框架构建方法。
背景技术
在开发一个项目时,都是很多人协同开发,如果在项目中需要用到第三方工具包,例如json工具包,可能有人会导入阿里的fastJson,有人会导入谷歌的gson,这样会对代码管理带来很多麻烦。而且这些工具包对代码的侵入性很强,如果想把一款工具包换成实现类似功能的另一款工具包,需要去修改大量代码,像Spring、SpringMvc、Hibernate、Mybatis这些开源框架,过于重量级,重量级的原因有以下两点(1)这些框架都提供了很多功能,但是有很多功能在工作中都是不太适用的或者用不到的。而这些功能的存在,会带来一下三个问题:1.1用户对框架的学习成本会增加。1.2会增加框架的复杂性,使框架出现bug的几率增加。1.3用户在使用这个框架时,需要配置是否使用此功能,这样也会为用户的使用带来复杂性。(2)后台实现逻辑的复杂性。由于后台实现逻辑的复杂,当在使用中遇到一些问题的时候,会很难定位这些问题产生的原因。
因此,目前亟需有一款更轻量级的框架,在特定的场景下,可以替代这些比较重量级的开源框架。
发明内容
为了解决以上问题,本发明提出了一种对工具包统一管理并实现轻量级MVC的框架构建方法,包括三大模块分别为PLUGIN模块、SOA模块与PRODUCT模块;
所述PLUGIN模块为一类实现了共通功能的工具包,抽象出来一个接口,让每一个工具包都各自作为自己的一个服务端去实现这个接口,在用一个客户端这个客户端中存放了接口的一个引用,用户可以利用这个客户端中的引用,去调用这个接口中提供的方法,PLUGIN模块主要是面向功能的模块;所述SOA模块为替代spring、springMvc、Hibernate、myBatis的框架;所述PRODUCT模块为PLUGIN模块的升级,所述PRODUCT模块主要是面向业务,除了具有PLUGIN模块的功能之外,还可以接收用户从前端提交过来的请求,并通过MVC的路由的转发,直接转发到对应的server端的包里,并处理请求;
具体采用以下方法:
(1)基于约定大于配置原则,基本实现零配置;
(2)路由的分发:基于servlet3.1的异步非阻塞功能,通过自定义注解,系统启动时会扫描被注解标记的方法,然后就注解的元数据信息与方法的元数据信息封装到一个JLFMVCRouteTarget对象,并以注解中的url为key,JLFMVCRouteTarget对象为value,存储到Map中,当请求到来时,会根据请求的url去map中查找对应的处理方法,处理请求后响应给用户;
(3)提供多数据库之间的事务管理:定义ThreadLocal变量,在ThreadLocal存放一个Map,Map中的key为当前线程已打开数据库事务的对应的数据库名称,value为对应的connection对象。然后对connection对象上加上allowCommit的bollean属性,这个属性初始化为false,当一个提交请求到来时,要传来数据库名称的参数,然后去遍历Map,看除当前数据库名称对应的connection对象以外,其它所有的connection对象的allowCommit属性是否都为true,如果有一个不是true,就把当前的connection属性变为true,然后直接返回,如果所有的都为true,就依次的将connection全部提交;
(4)集成缓存框架,并提供对数据库id黑名单管理,防止缓存穿透;
(5)封装ORM关系映射;
(6)实现了bean容器的管理以及依赖注入:通过自定义注解,把需要被容器管理的来用注解标注,系统启动时,会扫描这些被注解标注的类,并采用策略模式,生成对象,并将对象放入容器。然后遍历该类的所有字段,查看字段的类型是否被注解标注,如果被注解标注,则去容器中查找该类型对应的对象,如果没有找到,则去生成此对象并放入容器,最后将该对象赋值给该字段;
(7)可以通过实体类,导出相应的sql脚本和数据字典:根据注解信息进行导出;
(8)可以导出每个请求的请求参数、验证规则、响应参数等信息,方便前后端的协作开发:根据注解信息进行导出。
进一步的,所述缓存穿透有以下两种情况:一是用户做恶意攻击,一直拿数据库中都没有的id去查,这样每次都会穿透缓存;二是对于数据库中有的id,但是缓存中没有,这时如果查询此id的请求大并发过来,仍会穿透缓存,针对第一种情况,在实体的父类中添加isBlack属性,此属性初始化都为false,然后在数据库中如果查询id不存在,就新建一个实体对象,此时这个对象其它属性为空,只有isBlack属性不为空,并存到缓存,在下一次查询此id请求过来时,会在缓存中查询到该对象,然后在判断该对象的isBlack属性为true,则返回null。针对第二种情况,在缓存中查询不到时,会利用redis的setnx方法创建锁,只有创建锁成功的线程才可以访问数据库,并将查询结果回写至redis,对于没有创建锁成功的线程,会一直做自旋,直到第一个线程将结果回写至redis后,这时其它线程都可以从redis中获取结果,无需访问数据库。
采用上述技术方案,具有如下有益效果:
本框架的PLUGIN模块和PRODUCT模块可以有效的对第三方工具包做统一管理,实现了业务代码与工具包的完全解耦。而SOA-MVC模块提供了更轻量级的操作,无论从用户的学习成本、用户的使用,还是后台实现逻辑,相比Spring、Hibernate、mybatis等,都会更加简单,从而一定程度上提高开发效率。
附图说明
图1为本发明的架构图;
具体实施方式
下面结合附图对本发明做进一步说明。
实施例1:根据如图1所示一种对工具包统一管理并实现轻量级MVC的框架构建方法,包括三大模块分别为PLUGIN模块、SOA模块与PRODUCT模块;
所述PLUGIN模块为一类实现了共通功能的工具包,抽象出来一个接口,让每一个工具包都各自作为自己的一个服务端去实现这个接口,在用一个客户端这个客户端中存放了接口的一个引用,用户可以利用这个客户端中的引用,去调用这个接口中提供的方法,PLUGIN模块主要是面向功能的模块;所述SOA模块为替代spring、springMvc、Hibernate、myBatis的框架;所述PRODUCT模块为PLUGIN模块的升级,所述PRODUCT模块主要是面向业务,除了具有PLUGIN模块的功能之外,还可以接收用户从前端提交过来的请求,并通过MVC的路由的转发,直接转发到对应的server端的包里,并处理请求。
本发明中的PLUGIN模块:将一类实现了共通功能的工具包,抽象出来一个接口,然后让每一个工具包都各自作为自己的一个服务端,去实现这个接口,然后在用一个客户端,这个客户端中存放了接口的一个引用,用户可以利用这个客户端中的引用,去调用这个接口中提供的方法。
虽然有客户端和服务端的概念,但是并不需要做远程调用,每个客户端和服务端都只是一个普通的jar包,用户在编译代码时,只需要依赖客户端即可以完成编译,无需关注服务端基于什么实现,在启动项目前,将对应的服务端包导入到项目中即可,在项目启动的过程中,会自动扫描项目中依赖的所有客户端,然后针对于每个客户端,在去扫描这个客户端对应的服务端,在服务端中找到接口的实现类,然后启动服务,并把实现类对象赋值给客户端中的引用。
如果想把一款工具包换成另外一款实现同样功能的工具包,也只需要替换对应的服务端包即可,无需对代码进行修改。
如果某个服务端的配置文件进行修改,无需重启整个系统,可单独对这个服务端进行重启,在集群模式下,无需对每一台都重启,在一台服务器重启成功以后,会以广播的形式通知到其它服务器,其它服务器接收到通知后,会自动进行重启。
本发明的SOA-MVC模块:SOA-MVC模块可以替代spring、springMvc、Hibernate、myBatis这些框架,相对于这些开源框架,此mvc框架无论从用户使用,还是后台逻辑的实现,都会更加简单,更加轻量级。而且还实现了一些这些开源框架没有实现的功能。实现的功能如下:
2.1基于约定大于配置原则,基本实现零配置。
2.2路由的分发。
技术实现方案:基于servlet3.1的异步非阻塞功能。通过自定义注解,系统启动时会扫描被注解标记的方法,然后就注解的元数据信息与方法的元数据信息封装到一个JLFMVCRouteTarget对象,并以注解中的url为key,JLFMVCRouteTarget对象为value,存储到Map中,当请求到来时,会根据请求的url去map中查找对应的处理方法,处理请求后响应给用户。
2.3提供多数据库之间的事务管理。
技术实现方案:定义ThreadLocal变量,在ThreadLocal存放一个Map,Map中的key为当前线程已打开数据库事务的对应的数据库名称,value为对应的connection对象。然后对connection对象上加上allowCommit的bollean属性,这个属性初始化为false,当一个提交请求到来时,要传来数据库名称的参数,然后去遍历Map。
看除当前数据库名称对应的connection对象以外,其它所有的connection对象的allowCommit属性是否都为true,如果有一个不是true,就把当前的connection对象的allowCommit属性变为true,然后直接返回,如果所有的都为true,就依次的将connection全部提交。
2.4集成缓存框架,并提供对数据库id黑名单管理,防止缓存穿透。
缓存穿透有以下两种情况:
1、用户做恶意攻击,一直拿数据库中都没有的id疯狂去查,这样每次都会穿透缓存。
2、对于数据库中有的id,但是缓存中没有,这时如果查询此id的请求大并发过来,仍会穿透缓存。
技术实现方案:针对第一种情况,在实体的父类中添加isBlack属性,此属性初始化都为false,然后在数据库中如果查询id不存在,就新建一个实体对象,此时这个对象其它属性都为空,只有isBlack属性为空,并存到缓存,在下一次查询此id请求过来时,会在缓存中查询到该对象,然后在判断该对象的isBlack属性是否为true,则返回null。针对第二种情况,在缓存中查询不到时,会利用redis的setnx方法创建锁,只有创建锁成功的线程才可以访问数据库,并将查询结果回写至redis,对于没有创建锁成功的线程,会一直做自旋,知道第一个线程将结果回写至reids后,这时其它线程都可以从redis中获取结果,无需访问数据库。
2.5封装ORM关系映射,比使用hibernate和mybatis更加简单。
技术实现方案:与mybatis相比,有两个好处,第一:不需要在对简单sql进行处理,在此框架中,简单sql都已经封装好,可直接用。第二:在对复杂sql做查询时,无需手写数据库字段与bean字段的映射管理,在此框架中,直接通过反射,对bean的字段赋值。
2.6实现了bean容器的管理以及依赖注入。
技术实现方案:通过自定义注解,把需要被容器管理的类用注解标注,系统启动时,会扫描这些被注解标注的类,并采用策略模式,生成对象,并将对象放入容器。然后遍历该类的所有字段,查看字段的类型是否被注解标注,如果被注解标注,则去容器中查找该类型对应的对象,如果没有找到,则去生成此对象并放入容器,最后将该对象赋值给该字段。
2.7可以通过实体类,导出相应的sql脚本和数据字典。
技术实现方案:根据注解信息进行导出。
2.8可以导出每个请求的请求参数、验证规则、响应参数等信息,方便前后端的协作开发。
技术实现方案:根据注解信息进行导出。
本发明的PRODUCT模块实际上就是对PLUGIN模块做了一次升级,因为PLUGIN模块主要是面向于功能,让程序开发者去使用。而PRODUCT模块主要是面向于业务,它除了具有PLUGIN的功能以外,还可以接收用户从前端提交过来的请求,并通过MVC的路由的转发,直接转发的对应的server端的包里,并处理请求。
提供比Spring、SpringMvc、Hibernate、Mybatis等等更加轻量级的开源框架,并提供对第三方工具包的统一管理。
以上描述了本发明的基本原理和主要特征,本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内,发明要求保护范围由所附的权利要求书及其等效物界定。
Claims (1)
1.一种对工具包统一管理并实现轻量级MVC的框架构建方法,包括三大模块分别为PLUGIN模块、SOA模块与PRODUCT模块;
所述PLUGIN模块为一类实现了共同功能的工具包,抽象出来一个接口,让每一个工具包都各自作为自己的一个服务端去实现这个接口,再用一个客户端存放接口的一个引用,用户利用这个客户端中的引用,去调用这个接口中提供的方法,PLUGIN模块主要是面向功能的模块;所述SOA模块为替代spring、springMvc、Hibernate、myBatis的框架;所述PRODUCT模块为PLUGIN模块的升级,所述PRODUCT模块主要是面向业务,除了具有PLUGIN模块的功能之外,还可以接收用户从前端提交过来的请求,并通过MVC的路由转发,直接转发到对应的server端的包里,并处理请求;
具体采用以下方法:
(1)基于约定大于配置原则,基本实现零配置;
(2)路由的分发:基于servlet3.1的异步非阻塞功能,通过自定义注解,系统启动时会扫描被注解标记的方法,然后就注解的元数据信息与方法的元数据信息封装到一个JLFMVCRouteTarget对象,并以注解中的url为key,JLFMVCRouteTarget对象为value,存储到Map中,当请求到来时,会根据请求的url去map中查找对应的处理方法,处理请求后响应给用户;
(3)提供多数据库之间的事务管理:定义ThreadLocal变量,在ThreadLocal存放一个Map,Map中的key为当前线程已打开的数据库事务对应的数据库名称,value为对应的connection对象,然后对connection对象加上boolean类型的allowCommit属性,这个属性初始化为false,当一个提交请求到来时,要传来数据库名称的参数,然后去遍历Map,判断除当前数据库名称对应的connection对象以外,其它所有的connection对象的allowCommit属性是否都为true,如果有一个不是true,就把当前的connection对象的allowCommit属性变为true,然后直接返回,如果所有的都为true,就依次的将connection全部提交;
(4)集成缓存框架,并提供对数据库id黑名单管理,防止缓存穿透;
(5)封装ORM关系映射;
(6)实现bean容器的管理以及依赖注入;
(7)通过实体类,导出相应的sql脚本和数据字典:根据注解信息进行导出;
(8)导出每个请求的请求参数、验证规则、响应参数信息,方便前后端的协作开发:根据注解信息进行导出;
所述缓存穿透有以下两种情况:
一是用户做恶意攻击,一直用数据库中不存在的id去查询,这样每次都会穿透缓存;
二是对于数据库中有的id,但是缓存中没有,这时如果查询此id的请求量大,仍会穿透缓存;
针对第一种情况,在实体的父类中添加isBlack属性,此属性初始化都为false,然后在数据库中如果查询id不存在,就新建一个实体对象,此时这个对象其它属性都为空,只有isBlack属性不为空,并存到缓存,在下一次查询此id请求过来时,会在缓存中查询到该对象,然后再判断该对象的isBlack属性为true,则返回null;针对第二种情况,在缓存中查询不到时,会利用redis的setnx方法创建锁,只有创建锁成功的线程才可以访问数据库,并将查询结果回写至redis,对于没有创建锁成功的线程,会一直做自旋,直到第一个线程将结果回写至redis后,这时其它线程都可以从redis中获取结果,无需访问数据库;
所述封装ORM关系映射中,简单sql都已经封装好,能够直接用;在对复杂sql做查询时,无需手写数据库字段与bean字段的映射管理,直接通过反射,对bean的字段赋值;
所述实现bean容器的管理以及依赖注入中,通过自定义注解,把需要被容器管理的类用注解标注,系统启动时,会扫描这些被注解标注的类,并采用策略模式,生成对象,并将对象放入容器,然后遍历该类的所有字段,查看字段的类型是否被注解标注,如果被注解标注,则去容器中查找该类型对应的对象,如果没有找到,则去生成此对象并放入容器,最后将该对象赋值给该字段。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911315660.8A CN111190577B (zh) | 2019-12-19 | 2019-12-19 | 一种对工具包统一管理并实现轻量级mvc的框架构建方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911315660.8A CN111190577B (zh) | 2019-12-19 | 2019-12-19 | 一种对工具包统一管理并实现轻量级mvc的框架构建方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111190577A CN111190577A (zh) | 2020-05-22 |
CN111190577B true CN111190577B (zh) | 2023-03-31 |
Family
ID=70710127
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911315660.8A Active CN111190577B (zh) | 2019-12-19 | 2019-12-19 | 一种对工具包统一管理并实现轻量级mvc的框架构建方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111190577B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114237774B (zh) * | 2022-02-14 | 2022-05-31 | 北京华御数观科技有限公司 | 一种解除功能模块依赖的内部调用方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103745369A (zh) * | 2014-01-14 | 2014-04-23 | 中航金网(北京)电子商务有限公司 | 基于b/s架构的零备件销售支持系统的数据管理方法及装置 |
CN105739987A (zh) * | 2016-02-03 | 2016-07-06 | 成都四方伟业软件股份有限公司 | 面向SOA的快速构建JavaWeb应用的系统框架 |
CN105824619A (zh) * | 2016-03-10 | 2016-08-03 | 四川交通职业技术学院 | 基于Spring MVC、Apache Shiro、MyBatis框架整合的代码生成器 |
CN109710248A (zh) * | 2018-12-29 | 2019-05-03 | 江苏徐工信息技术股份有限公司 | 一种基于Web开发分模块框架的搭建方法 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
BR112015000480B1 (pt) * | 2012-07-09 | 2023-02-07 | Vid Scale, Inc | Arquitetura de codec para codificação de vídeo de camada múltipla, método e sistema |
US9229694B2 (en) * | 2013-03-15 | 2016-01-05 | Gamesys Ltd. | Systems and methods for facilitating application development utilizing plugins |
-
2019
- 2019-12-19 CN CN201911315660.8A patent/CN111190577B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103745369A (zh) * | 2014-01-14 | 2014-04-23 | 中航金网(北京)电子商务有限公司 | 基于b/s架构的零备件销售支持系统的数据管理方法及装置 |
CN105739987A (zh) * | 2016-02-03 | 2016-07-06 | 成都四方伟业软件股份有限公司 | 面向SOA的快速构建JavaWeb应用的系统框架 |
CN105824619A (zh) * | 2016-03-10 | 2016-08-03 | 四川交通职业技术学院 | 基于Spring MVC、Apache Shiro、MyBatis框架整合的代码生成器 |
CN109710248A (zh) * | 2018-12-29 | 2019-05-03 | 江苏徐工信息技术股份有限公司 | 一种基于Web开发分模块框架的搭建方法 |
Non-Patent Citations (1)
Title |
---|
J2EE开发常用框架;段兰;《信息与电脑》;20110430(第04期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN111190577A (zh) | 2020-05-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108228166B (zh) | 一种基于模板的后端代码生成方法及系统 | |
US9231974B2 (en) | Dynamic policy-based entitlements from external data repositories | |
US7200806B2 (en) | System and method for generating pre-populated forms | |
US7725496B2 (en) | System and method for identifying application resources | |
US20040230667A1 (en) | Loosely coupled intellectual capital processing engine | |
JP5964027B2 (ja) | ビジネスネットワーク管理発見およびビジネスネットワーク管理集約のためのシステムおよび方法 | |
US7606792B2 (en) | System and method for efficient evaluation of a query that invokes a table valued function | |
US20080263006A1 (en) | Concurrent searching of structured and unstructured data | |
US7428756B2 (en) | Access control over dynamic intellectual capital content | |
US20100250603A1 (en) | System and Method of Performing Risk Analysis using a Portal | |
CN102567400B (zh) | 一种实现Web访问的方法和Web服务器 | |
EP3465436A1 (en) | Extending object-schema-based application programming interfaces (apis) | |
CN106649488B (zh) | 多数据源交互接口的调用方法及装置 | |
US20210390006A1 (en) | Method and electronic device for querying application programming interfaces of webpage | |
US20040230982A1 (en) | Assembly of business process using intellectual capital processing | |
CN109145009B (zh) | 一种基于SQL检索ElasticSearch的方法 | |
US9373093B2 (en) | Gateway service manager for business object applications | |
CN111190577B (zh) | 一种对工具包统一管理并实现轻量级mvc的框架构建方法 | |
CN115599386A (zh) | 代码生成方法、装置、设备及存储介质 | |
CN112256728B (zh) | 一种基于虚实融合的数据空间构建方法及标识解析方法 | |
CN113127906A (zh) | 基于c/s架构的统一权限管理平台、方法及存储介质 | |
CN106201542B (zh) | 一种wof快速开发平台 | |
WO2023125755A1 (zh) | 基于大规模集群的服务请求处理方法、装置、设备及介质 | |
US20040230567A1 (en) | Integrating intellectual capital into an intellectual capital management system | |
CN107203594B (zh) | 一种数据处理设备、方法和计算机可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |