浅说动态生成Class实现MVC
2019独角兽企业重金招聘Python工程师标准>>>
<h1>前言</h1> <p>java web的MVC,一个烂的不能再烂的一个话题了,可以说,现在市面上或者网上一搜,都有很多很优秀的MVC框架。那么这里为什么还要写一篇着相关的文章呢,在这介绍下本文的背景,之前帮一个朋友做个网站,由于本人只会java,所以就用java写了一个,但是由于资金有限,只能找一些便宜的jsp空间,那么这样随之而来的问题就是,这样的空间实在是给的东西有限,最主要的问题就是内存不够。所以就想,如果我不用任何框架,纯servlet编写,是否就能节约内存和提高执行效率,于是选择了直接采用servlet编写,但是这样确实带来很多维护和编程上的不便。于是就想能否写一个MVC框架,在程序执行之前按照规则自动生成各种代理类,那么在程序运行的时候就不需要什么反射,注入等等。既然目标已经确定,那么就按照这个思路继续往下走吧,就是如何按照规则自动生成我们想要的class。</p> <h1>Action规则制定</h1> <p>首先我们希望定义Action的规则,他的主要作用就是告诉程序,不同的请求是由哪些类和方法处理的。看看下面的代码: </p> <pre style="overflow: auto" class="brush:java;gutter:true;first-line:1;tab-size:4;toolbar:true;">代码1: @Action("/MockServlet") public class MockServletAction {
@UrlMapping(value="/execute.action",method="GET",result="SUCCESS",path="/servlet/test.jsp"
)
public String execute() throws IOException {return "SUCCESS";
}
}</pre>
<p>这段代码很容易读懂,@Action注解告诉程序,所有以/MockServlet开头的请求由这个类处理,而@UrlMapping中的value告诉程序在/MockServlet之后又是"/execute.action"由execute()这个方法处理,并且必须是GET方式发送过来的请求;到到目前位置,这些注解有点Spring Mvc的味道了,接下来就是@UrlMapping的result和path属性了,其实他的意思就是当这个方法返回的是SUCCESS的时候采用"/servlet/test.jsp" 这个页面做图片的渲染。</p>
<p>接下来就是如何生成我们想要的代码了,首先让我们使用最原始的Servlet实现上面的功能,假设我们的Action没有任何注解,代码如下: </p>
<pre style="overflow: auto" class="brush:java;gutter:true;first-line:1;tab-size:4;toolbar:true;">代码2: public class MockServletAction { public String execute() throws IOException { return "SUCCESS"; } }</pre>
<p>我们同样想让这个Action去处理/MockServlet/execute.action这个GET请求,那么我们应该按照如下代码做:</p>
<pre style="overflow: auto" class="brush:java;gutter:true;first-line:1;tab-size:4;toolbar:true;">代码3: public class ActionServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String servletPath = req.getServletPath(); if(servletPath.equals("/MockServlet/execute.action")){ String result = new MockServletAction().execute(); if(result.equals("SUCCESS")){ req.getRequestDispatcher("/servlet/test.jsp").forward(request, response); } } } }</pre>
<p>通过上面就能够明白,我们希望有这么一个框架,它能够通过代码1中的注解的中所定义的请求转发规则来自定生成代码3。这样就既能够高效率的运行,减少系统运行时资源的损耗,同时也也能提高开发效率。 </p>
<p>我们也可以为事务做自动修改class,无非就是在方法前后加入事务启动和事务提交的代码;依赖注入的话就在构造方法中生成注入的代码等等. </p>
<h1>Class自动生成的策略</h1>
<p>有人也有疑问,就是我自动生成class,同样也是消耗资源的。没错不仅仅消耗资源,而且还消耗的非常多。但是这种消耗是一次性的,也就是说我程序运行开始就将class生成好,以后就直接使用这个class而无需重复生成。但是有的时候server的配置实在太烂,或者我就是个极端主义者,我就是希望server损耗的越少越好。那么为此这个就有以下两种策略供选择: </p>
<h2>1.运行时自动生成Class </h2>
<p>程序运行开始将所有需要的class自动生成或者将修改后的class替换成原有的class。当然这种方式的优点就是开发阶段快,但是弊端就是,我们无法在server中替换已经load的class,并且大多数的server提供商也不让你使用自定义系统级别的classloader,所以我们自动生成的class都将以反射的方式调用。 </p>
<h2>2.在开发阶段自动生成Class</h2>
<p>在开发阶段就自动生成class,然后打包到war包中,这样在server上运行的时候使用我们生成的class就和一般的方法调用没有任何区别,也就是这一点使得我们能够规避掉策略1中的弊端。原则上讲着一种方式在开发和打包这两个阶段中多了一个步骤,就是添加自动生成的class,但是由于项目采用MAVEN开发,我们能够编写一个maven插件,自动的执行自动生成类的打包。所以建议使用这种方式。 </p>
<h1>实现</h1>
<p>目前上述构想已经实现,项目名称为Wheel,而maven插件名称为wheel-maven-plugin。但是wheel所使用的依赖包asmsupport-0.3-SNAPSHOT,classgrep-1.2-SNAPSHOT都还没有release,还没有发布到maven,所以需要手动maven install到本地的maven仓库。各个包编译打包顺序如下: </p>
<ul> <ol>asmsupport执行maven clean install</ol>
<ol>classgrep执行maven clean install</ol>
<ol>wheel执行maven clean install</ol>
<ol>wheel-maven-plugin执行maven clean install</ol> </ul>
<p>这里也有一个简单是实例WheelSampleApp, 里面展示了大部分的功能,如AOP,注入等等。</p>
<p>以上涉及到的项目的源码地址:</p>
<ul> <ol><b>asmsupport:</b>http://code.taobao.org/svn/asmsupport/trunk</ol>
<ol><b>classgrep:</b>http://code.taobao.org/svn/classgrep/trunk</ol>
<ol><b>wheel:</b>http://code.taobao.org/svn/wheel/trunk</ol>
<ol><b>wheel-maven-plugin:</b>http://code.taobao.org/svn/wheel-maven-plugin/trunk</ol>
<ol><b>WheelSampleApp:</b>http://code.taobao.org/svn/WheelSampleApp/trunk</ol> </ul>
<p>Wheel和wheel-maven-plugin正在酝酿发布第一个版本,而calssgrep-1.1和asmsupport-0.2都已经发布,只是wheel所依赖的classgrep-1.2和asmsupport-0.3 这两个新版本还为发布,后续也将补全新功能和bug陆续发布。 </p>
转载于:https://my.oschina.net/wensiqun/blog/169494
浅说动态生成Class实现MVC相关推荐
- MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航
MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航 原文:MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航 上篇文章我们完成了 动态生成多级菜单 这个实用组件. 本篇 ...
- .net core将URL请求格式化为XML或JSON(网站动态生成sitemap.xml)
.net core将URL请求格式化为XML或JSON(网站动态生成sitemap.xml) 首先设置 Startup.cs 文件 配置 ConfigureServices services.AddM ...
- c# mvc5 view 多层_MVC5+EF6 入门完整教程13 -- 动态生成多级菜单
稍微有一定复杂性的系统,多级菜单都是一个必备组件. 本篇专题讲述如何生成动态多级菜单的通用做法. 我们不用任何第三方的组件,完全自己构建灵活通用的多级菜单. 需要达成的效果:容易复用,可以根据mode ...
- highcharts ajax 数据格式,Highcharts ajax获取json对象动态生成报表生成 .
最近做个项目,项目经理想做一个统计报表,在网上查看些资料就选用Highchars 这里和大家分享下使用心得. 重点说明此代码是针对一个报表显示多个项对比显示. 直接贴代码:web端 $(documen ...
- php生成gif动态图片_动态生成gif格式的图像要注意?
动态生成gif格式的图像要注意? 更新时间:2006年10月09日 00:00:00 作者: 如果你用 int imagecreatefromgif(string filename); 来取出一张 ...
- css画表格多级表头,element UI实现动态生成多级表头
一.效果图 二.封装两个组件,分别为DynamicTable.vue和TableColumn.vue,TableColumn.vue主要是使用递归来对表头进行循环生成 DynamicTable.vue ...
- 【转载】 Python动态生成变量
用Python循环创建多个变量, 如创建 a1= .a2= .a3= .a4= .a5= 或 self.a1= .self.a2= . self.a3= 一. 可以通 ...
- Asp.net动态生成html页面
作者:网际浪子专栏(曾用名littlehb) http://blog.csdn.net/littlehb/ 适用于:Microsoft ASP.NET 摘要:asp.net动态生成html页面,适用 ...
- awstats CGI模式下动态生成页面缓慢的改进
本文可以看做是 多server多站点情况下awstats日志分析 这篇文章的下篇,在使用过程中发现awstats在cgi模式下动态生成分析报告慢的问题 (尤其是有些站点每天两个多G的日志,查看起来简直 ...
最新文章
- 报错解决:ad NaCl helper startup ack (0 bytes)
- 小师妹学JavaIO之:NIO中那些奇怪的Buffer
- 数据仓库分层类型-具体实例
- 作者:周园春(1975-),男,博士,中国科学院计算机网络信息中心研究员、博士生导师。...
- java 解析docx_java解析xlsx和docx 文件 | 学步园
- centos 6.3+mysql+5.6+nginx 1.5.8
- excel文件修复工具_七款免费的PDF处理工具
- MAC 及 Python 快捷键
- Spring Security 原理
- [技术贴]网络共享与便携式WiFi热点之USB绑定模式
- 暴力破解密码 - C++ 递归方法实现
- 助力PAT甲级/乙级取得满分的小技巧,STL容器
- 27岁计算机考研,男生27岁研究生毕业真的晚吗?
- canvas 将两张图片叠加
- Prometheus监控以及告警配置
- Android P 亮屏慢分析
- 励志情感类视频剪辑需要如何制作?
- Lammps模拟剪切作用下的位错滑移
- 安装torchvision-0.12.0+cu113版本
- Unraid 使用技巧集合