超敏捷 Java 开发框架 ServcieFramework 作者祝海林专访 .

ServcieFramework是一个敏捷、快速、富领域模型的Java MVC 框架,其设计理念是让用户真正能够用最简单的方式解决80%的问题。

该项目目前应用于作者公司内部的一个产品中, 刚开源不久,便引起了开发者的广泛关注与讨论。为了使大家进一步了解该框架,我们专访了作者祝海林。

欢迎大家推荐更多开源项目给我们,支持中国的开源项目发展,如果您和您的团队希望展示创业理念和有趣之处,或者有朋友正在创造这样的价值,请联系我们,发信到[email protected]即可。

先来个自我介绍吧!
 

网名 WilliamZhu,微博@PrinceCharmingJ。Java程序员,4年开发经验,2010年懵懂来京。有过短暂几天Rails程序员生涯,颇为自豪。曾经为了创建一个音乐新模式的尝试而奋斗过,至今仍念念不忘。现专注于搜索和数据挖掘领域。平常的爱好就是向大牛们提问、聆听、学习。

ServcieFramework 是什么? 

ServcieFramework,一个敏捷、快速、其ORM 和 Controller等设计会 surprize 你的一个 Java MVC 框架,专为移动应用后端量身定做,适用于快速搭建一个后端服务(说的好像有点拗口,oh yeah~~~)

ServcieFramework 三大亮点

  •     ORM 实现真正的充血模型,非常 ActiveRecord 化。   
  •     非常轻量,你完全看不到servlet api,因为压根就没有使用Servlet规范。应用本身是一个普通的Java程序,http监听只是其中的一个模块。
  •     便于测试。模型类和controller都可以当作普通的类来进行测试。 

发起这个项目的初衷是什么? 

项目的起源是我们要用Java写一个后台服务,提供Web API,但觉的Spring太重,后来我们用nutz开发,但仍然觉得nutz有很多限制,比如,我们对response status比较重视。客户端会根据不同状态码进行不同处理,nutz就显得支持有点弱了。最后我跟老板说,给我机会,我可以写个更轻量,更RESTFul的。于是便在老板的支持下有了ServcieFramework。目前该项目应用在我们的搜索产品中。

开发效率比肩Rails,如何体现?是如何实现的? 

你可以 clone  ServiceFramework一份下来试试。当然从文档也是能够直观看到的。待会我会举几个小例子。

另外之前我也发过一篇关于 ServiceFramewok的资讯,不愿意看文档的同学也可以看看这篇简短的资讯。

为了充分说明开发的便捷性,我直接在这篇采访稿中做个例子。

建立一张表:

[sql] view plain copy print ?
  1. --标签表     
  2. CREATE TABLE `tag` (    
  3.   `id` int(11) NOT NULL AUTO_INCREMENT,    
  4.   `namevarchar(255) DEFAULT NULL,    
  5.   `tag_synonym_id` int(11) DEFAULT NULL,    
  6.   `weight` int(11) DEFAULT NULL,    
  7.   PRIMARY KEY (`id`)    
  8. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;    
  9.     
  10. --标签组。一个标签可以属于多个标签组。一个标签组包含多个标签     
  11. CREATE TABLE `tag_group` (    
  12.   `id` int(11) NOT NULL AUTO_INCREMENT,    
  13.   `namevarchar(32) DEFAULT NULL,    
  14.   PRIMARY KEY (`id`),    
  15.   UNIQUE KEY `id` (`id`)    
  16. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;  


定义两个类:

[java] view plain copy print ?
  1. public class Tag extends Model {    
  2.     @Validate    
  3.     private final static Map $name = map(    
  4.     presence, map("message""{}字段不能为空"),    
  5.     uniqueness, map("message""{}字段不能重复")    
  6.     );    
  7.     
  8.     @ManyToMany    
  9.     private List<TagGroup> tag_groups = list();    
  10. }    
  11.     
  12. public class TagGroup extends Model {    
  13.     @ManyToMany    
  14.     private List<Tag> tags = list();    
  15. }    

Ok了,模型类建立完毕。 写一个controller: 

 
 

[java] view plain copy print ?
  1. public class TagController extends ApplicationController {    
  2.          
  3.      @BeforeFilter    
  4.      private final static Map $check_params = map(only, list("save"));    
  5.          
  6.      @At(path = "/blog", types = POST)    
  7.      public void save() {    
  8.          if(!Tag.save(params())){    
  9.              render(HTTP_400,tag.validateResults);    
  10.          }    
  11.          render(ok());    
  12.      }    
  13.          
  14.      private void check_params(){    
  15.        if(isEmpty(param("tag")))render(HTTP_400,"您至少需要传递一个name字段");    
  16.      }    
  17. }    

一个简单的例子就做完了。查询方面提供了Arel的查询形式。比如: 

[java] view plain copy print ?
  1. List<Order> orders = Order.where("status=:status",map("status",Order.Status.NEW)).joins("details").fetch();   

ServiceFramewok实现重点有三个方面: 

  • 简化ORM框架。在我看来,Rails 的ActiveRecord是ORM的最佳实践。ServiceFramework的ORM基本是照着它改的。
  • 重新设计Controller中的 filter(interceptor)。各种before filter、around filter 可以有效简化逻辑应用。而框架本身则努力简化filter的使用。
  • 规范化项目目录。目前大部分新的框架都是这么做到的。一开始就给你生成一个标准的项目目录结构。ServiceFramework则进一步简化了这个操作。
顺带提一下目前类似Rails的Java框架可能会用到的一些技术: 

  • 字节码增强。比如javassist、cglib等。代表有PlayFramework。
  • AOP 通过对注解等的解析,生成相应的切面文件。不过这需要特定的编译器。代表有 Spring ROO。
  • 还有就是通过IDE生成根据模板生成一些文件。这个可操作性不强。
ServiceFramework 目前采用的是字节码增强的方式。应用启动时会自动增强模型类。

我也可以直接用Rails(或者基于JVM的jRuby、Grails),为何还要使用这个框架? 

如果你想用Java,并且想获得类似Rails的敏捷开发效率,那么用ServiceFrameowrk。 

转换语言需要考虑很多问题。比如Rails是多进程模型,而Java项目通常是单进程多线程的。并且Ruby VM 和 JVM 在性能、健壮性、监控、GC等各个 
方面还是有差距的。至于JRuby、Grails等基于JVM上的语言,和原生Java的整合并不如想象中的那么完美。 

对于一般的互联网应用,如果你能够采用脚本语言,建议优先考虑Ruby(CRuby),接着Groovy,然后JRuby。

和其他框架(如Play)相比,ServcieFramework有什么优势或独特之处? 

应该说ServiceFramework得到Play的很多启发。Play是一个优秀的Java MVC框架。Play优于ServiceFramework的地方自然很多。 

个人觉得ServiceFramework不同于Play的地方: 

  • Play简单的引入JPA,当然提供了一些比较有意义的便利方法。而ServiceFramework完全简化了JPA,操作起来就和ActiveRecord差不多。
  • Play的Query Interface简单引入EBean,但是EBean完全是个静态语言的折中产物。
  • ServiceFramework对C层的Filter做过重新设计,非常好用。
为什么希望项目定位于移动互联网后端开发? 

从名字看出,这是一个写后端服务的框架。高效、敏捷符合移动互联网对快速开发的要求。并且能够获得Java社区带来所有好处。 

ServcieFramework并不适合企业开发,企业开发有点过于复杂,而且我也没有做过企业方面的开发。今后ServiceFramework 的roadmap 也是继续强化对移动互联网的开发支持。目前我在咨询一些做app后端的朋友,看如何简化他们的开发。

ServcieFramework的学习成本? 

通常情况下,你只要把ServiceFramework页面的README看完就行了。 

接着 `git clone  git://github.com/allwefantasy/ServiceFramework.git`,就可以添加controller、model,着手开发项目了。


基于什么开源协议?在项目中使用ServcieFramework应该注意哪些方面? 

GPL 2.0开源协议。 

ServiceFramework为了一个具体需求而诞生的,所以并不是适合所有的项目。只针对特定领域的需求。比如移动互联网后端服务的开发就很适合使用ServiceFramework。 

建议留意README中的一些提示。我这里重点提示几点,在目前这个版本下: 

  • 不要在旧项目中使用
  • 要遵循约定
  • 目前还不能放到标准的web容器比如tomcat、weblogic等。
估计看到第三点很多人会嘀咕了。其实目前的设计可以极大的简化你的部署流程。git clone到服务器上,接着运行./run.sh 脚本即可。性能方面大可不必担心,不会低于tomcat、weblogic等容器。另外建议你留意一下run.sh中Xmx等虚拟机参数。


该项目未来的发展计划? 

未来会根据使用情况来进行功能修补增强。下一步计划,我可以预见到的是: 

  • 隔绝ServiceFramework本身的依赖。也就是你看不到框架本身对第三方jar的依赖
  • 为模型类提供更多的自生成方法
  • 开始填补之前的仿PHP函数库
  • 我会开始寻求合作者,共同开发

目前项目贡献者情况?其他开发者如何参与? 

开源没多久。目前就我一个人维护。不过已经应用于公司内部的一个项目,所以大家不用担心使用性。当然如果真的要用,我建议先用在小项目中。 

如果要参与的话,可以直接到 ServiceFramework Fork一份下来,然后请求 merge 就行。想重度参与的可以联系我 [email protected]

你可能感兴趣的:(java,框架,敏捷,Rails,ActiveRecord,jruby)