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(&quot;/MockServlet&quot;) public class MockServletAction {

@UrlMapping(value=&quot;/execute.action&quot;,method=&quot;GET&quot;,result=&quot;SUCCESS&quot;,path=&quot;/servlet/test.jsp&quot;
)
public String execute() throws IOException {return &quot;SUCCESS&quot;;
}

}</pre>

<p>这段代码很容易读懂,@Action注解告诉程序,所有以/MockServlet开头的请求由这个类处理,而@UrlMapping中的value告诉程序在/MockServlet之后又是&quot;/execute.action&quot;由execute()这个方法处理,并且必须是GET方式发送过来的请求;到到目前位置,这些注解有点Spring Mvc的味道了,接下来就是@UrlMapping的result和path属性了,其实他的意思就是当这个方法返回的是SUCCESS的时候采用&quot;/servlet/test.jsp&quot; 这个页面做图片的渲染。</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 &quot;SUCCESS&quot;; } }</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(&quot;/MockServlet/execute.action&quot;)){ String result = new MockServletAction().execute(); if(result.equals(&quot;SUCCESS&quot;)){ req.getRequestDispatcher(&quot;/servlet/test.jsp&quot;).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相关推荐

  1. MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航

    MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航 原文:MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航 上篇文章我们完成了 动态生成多级菜单 这个实用组件. 本篇 ...

  2. .net core将URL请求格式化为XML或JSON(网站动态生成sitemap.xml)

    .net core将URL请求格式化为XML或JSON(网站动态生成sitemap.xml) 首先设置 Startup.cs 文件 配置 ConfigureServices services.AddM ...

  3. c# mvc5 view 多层_MVC5+EF6 入门完整教程13 -- 动态生成多级菜单

    稍微有一定复杂性的系统,多级菜单都是一个必备组件. 本篇专题讲述如何生成动态多级菜单的通用做法. 我们不用任何第三方的组件,完全自己构建灵活通用的多级菜单. 需要达成的效果:容易复用,可以根据mode ...

  4. highcharts ajax 数据格式,Highcharts ajax获取json对象动态生成报表生成 .

    最近做个项目,项目经理想做一个统计报表,在网上查看些资料就选用Highchars 这里和大家分享下使用心得. 重点说明此代码是针对一个报表显示多个项对比显示. 直接贴代码:web端 $(documen ...

  5. php生成gif动态图片_动态生成gif格式的图像要注意?

    动态生成gif格式的图像要注意? 更新时间:2006年10月09日 00:00:00   作者: 如果你用 int imagecreatefromgif(string filename); 来取出一张 ...

  6. css画表格多级表头,element UI实现动态生成多级表头

    一.效果图 二.封装两个组件,分别为DynamicTable.vue和TableColumn.vue,TableColumn.vue主要是使用递归来对表头进行循环生成 DynamicTable.vue ...

  7. 【转载】 Python动态生成变量

    用Python循环创建多个变量, 如创建 a1=   .a2=   .a3=   .a4=   .a5=    或  self.a1=    .self.a2=   . self.a3= 一. 可以通 ...

  8. Asp.net动态生成html页面

    作者:网际浪子专栏(曾用名littlehb)  http://blog.csdn.net/littlehb/ 适用于:Microsoft ASP.NET 摘要:asp.net动态生成html页面,适用 ...

  9. awstats CGI模式下动态生成页面缓慢的改进

    本文可以看做是 多server多站点情况下awstats日志分析 这篇文章的下篇,在使用过程中发现awstats在cgi模式下动态生成分析报告慢的问题 (尤其是有些站点每天两个多G的日志,查看起来简直 ...

最新文章

  1. 报错解决:ad NaCl helper startup ack (0 bytes)
  2. 小师妹学JavaIO之:NIO中那些奇怪的Buffer
  3. 数据仓库分层类型-具体实例
  4. 作者:周园春(1975-),男,博士,中国科学院计算机网络信息中心研究员、博士生导师。...
  5. java 解析docx_java解析xlsx和docx 文件 | 学步园
  6. centos 6.3+mysql+5.6+nginx 1.5.8
  7. excel文件修复工具_七款免费的PDF处理工具
  8. MAC 及 Python 快捷键
  9. Spring Security 原理
  10. [技术贴]网络共享与便携式WiFi热点之USB绑定模式
  11. 暴力破解密码 - C++ 递归方法实现
  12. 助力PAT甲级/乙级取得满分的小技巧,STL容器
  13. 27岁计算机考研,男生27岁研究生毕业真的晚吗?
  14. canvas 将两张图片叠加
  15. Prometheus监控以及告警配置
  16. Android P 亮屏慢分析
  17. 励志情感类视频剪辑需要如何制作?
  18. Lammps模拟剪切作用下的位错滑移
  19. 安装torchvision-0.12.0+cu113版本
  20. Unraid 使用技巧集合

热门文章

  1. 查看、关闭被占用的端口
  2. realmeq参数配置详情_小米11什么时候发布 小米11参数配置详情
  3. 使用线程池有以下几个目的
  4. 简单了解各种序列化技术-Protobuf序列化框架
  5. RocketMQ各种集群模式介绍
  6. Java 扫描并加载包路径下class文件
  7. Spring框架的前世今生以及对Spring的宏观认识
  8. Zookeeper的概述
  9. mysql的length函数和char_length中文字符长度计算函数
  10. SpringBoot_日志-日志框架分类和选择