作者:robbin 来源:JavaEye 酷勤网收集 2008-03-11
摘要
目前Warp框架还不是特别成熟,但是Warp-persistent已经相当稳定了,如果你是使用Hibernate/Spring/Struts来开发项目的话,不妨试试Warp,把spring换掉改成Hibernate/Warp/Struts2.0,也是一个不错的解决方案,全部运用annotation,让你的项目Zero Configuration。
Warp framework 是最近刚刚发布的、基于Google Guice的轻量级Web开发框架,我也是在JavaEye网站的新闻频道看到的这条新闻: warp-persist 1.0: 为Google Guice专门提供持久层与事务处理的框架,通过这个新闻仔细阅读了Warp网站上面的文档,感觉到很振奋,Warp是一个相当棒的Java Web框架,而且前景非常看好。
Warp框架充分利用了JDK5.0的Annotation和泛型机制,并且基于Google Guice这个IoC框架,提供了full-stack的Web开发设施,他主要包含了四个部分:
warp-persist框架:封装Hibernate和JPA,提供事务管理和持久化资源管理
warp-dynamic-finder:提供了基于Annotation的动态查询功能,让数据库查询变得异常简单,不再需要DAO层
warp-mvc:借鉴了Tapestry5,提供了一个基于事件机制和组件化的Web层,并且组件注入方式高度IoC化
warp-servlet: 提供了一些Servlet的封装和附加的高级功能,例如URL过滤,和其他web框架集成等等
这几年来,Java在Web开发框架方面的进步显得很有限,Spring/Hibernate组合对撼JBoss Seam形成两大竞争的主流态势,但是这两个Web框架在Web快速开发方面的创新还显得不够好:Spring是越来越臃肿了,配置文件也是越来越复杂难懂了;JBoss Seam门槛又过高,而且集成的JSF一向受人垢病,并非完美的解决方案,特别是在Ruby on Rails横空出世之后,Java社区对于简洁易用的快速web开发框架的企盼也是一直很高的。
Warp在我看来是这方面做的最好的,它有以下几个鲜明的特点:
一、充分利用JDK5的annotation,简化编程和配置文件
Warp基于Google Guice并且发扬光大,自身无配置文件,所有功能完成均通过annotation,所以编程相当简洁
二、大量使用JDK5的泛型编程,提供强类型安全保证
虽说脚本语言的Duck Typing理念很流行,不过Java的优势也就是类型安全,Spring大量运用反射和XML配置等于是放弃了Java的优势。Warp在泛型方面做的很好,我相信在IDE的帮助下,Warp编程会更轻松
三、Warp-persist提供了声明式的事务管理,终于可以取代Spring了
Google Guice很好很强大,但是它没有事务管理能力和资源管理能力,所以无法取代spring,但是Warp-persist填补了这一缺憾,注入和管理Hibernate很容易:
Warp框架充分利用了JDK5.0的Annotation和泛型机制,并且基于Google Guice这个IoC框架,提供了full-stack的Web开发设施,他主要包含了四个部分:
warp-persist框架:封装Hibernate和JPA,提供事务管理和持久化资源管理
warp-dynamic-finder:提供了基于Annotation的动态查询功能,让数据库查询变得异常简单,不再需要DAO层
warp-mvc:借鉴了Tapestry5,提供了一个基于事件机制和组件化的Web层,并且组件注入方式高度IoC化
warp-servlet: 提供了一些Servlet的封装和附加的高级功能,例如URL过滤,和其他web框架集成等等
这几年来,Java在Web开发框架方面的进步显得很有限,Spring/Hibernate组合对撼JBoss Seam形成两大竞争的主流态势,但是这两个Web框架在Web快速开发方面的创新还显得不够好:Spring是越来越臃肿了,配置文件也是越来越复杂难懂了;JBoss Seam门槛又过高,而且集成的JSF一向受人垢病,并非完美的解决方案,特别是在Ruby on Rails横空出世之后,Java社区对于简洁易用的快速web开发框架的企盼也是一直很高的。
Warp在我看来是这方面做的最好的,它有以下几个鲜明的特点:
一、充分利用JDK5的annotation,简化编程和配置文件
Warp基于Google Guice并且发扬光大,自身无配置文件,所有功能完成均通过annotation,所以编程相当简洁
二、大量使用JDK5的泛型编程,提供强类型安全保证
虽说脚本语言的Duck Typing理念很流行,不过Java的优势也就是类型安全,Spring大量运用反射和XML配置等于是放弃了Java的优势。Warp在泛型方面做的很好,我相信在IDE的帮助下,Warp编程会更轻松
三、Warp-persist提供了声明式的事务管理,终于可以取代Spring了
Google Guice很好很强大,但是它没有事务管理能力和资源管理能力,所以无法取代spring,但是Warp-persist填补了这一缺憾,注入和管理Hibernate很容易:
- Injector injector = Guice.createInjector(..., PersistenceService
- .usingHibernate()
- .across(UnitOfWork.TRANSACTION)
- .buildModule());
Injector injector = Guice.createInjector(..., PersistenceService .usingHibernate() .across(UnitOfWork.TRANSACTION) .buildModule());
要声明事务比spring可简单多了:
- public class MyService {
- @Inject Provider<Session> session;
- @Transactional
- public void createNewPerson() {
- session.get().saveOrUpdate(new Person(...));
- }
- }
public class MyService {
@Inject Provider<Session> session;
@Transactional
public void createNewPerson() {
session.get().saveOrUpdate(new Person(...));
}
}
Warp支持Hibernate/JPA的所有事务管理策略,不但注入方式简单,而且声明事务方式更简单,代码看着简洁,写着更省心。
四、Dynamic Finder实在很酷!
还是直接看代码吧:
- @Finder(query="from Person")
- public List<Person> listAll() { return null; }
@Finder(query="from Person")
public List<Person> listAll() { return null; }
用annotation声明一下,一行查询代码都没有,你还要DAO干啥呢?
- @Finder(query="from Person where firstName = :firstName")
- Person find(@Named("firstName") String name);
@Finder(query="from Person where firstName = :firstName")
Person find(@Named("firstName") String name);
带参数的绑定变量查询,还是一行代码不用写,DAO是啥?
- @Finder(query="from Person")
- List<Person> listAll(@FirstResult int first, @MaxResults int max);
@Finder(query="from Person") List<Person> listAll(@FirstResult int first, @MaxResults int max);
带分页的查询,还是一行代码不用写,谁用DAO我跟谁急 !
五、Web层也极其简单
Warp-MVC模仿了Tapestry 5的架构,但是作者做了大量的改良和简化,作者解释了一下为什么不直接使用Tapestry,而是自己开发的理由。
Warp-MVC看起来像一个Tapestry的简化版,有组件的概念,事件响应的方式,但是非常易用,非常简洁,URL映射也通过annotation方式声明,作者在自己的博客上面提供了相关的简单示例,可以参考:
http://www.jroller.com/dhanji/
Warp框架是最近几年来,我看到的第一个走在正确发展方向上的Java Web框架:结构简单、易用使用、但充分发挥了Java自身的语法优势,非常值得期待!
目前Warp框架还不是特别成熟,但是Warp-persistent已经相当稳定了,如果你是使用Hibernate/Spring/Struts来开发项目的话,不妨试试Warp,把spring换掉改成Hibernate/Warp/Struts2.0,也是一个不错的解决方案,全部运用annotation,让你的项目Zero Configuration。
友情提醒:Warp官方网站无法直接访问,建议在FireFox浏览器上面安装gladder插件,跨越GFW。
Warp Framework - 官方网站
作者对评论的回复:
1 如果你是一个有三年以上Java开发经验的程序员,我不相信学习一个Warp框架要花你几个月时间才能学会。这东西你找个周末钻研两个整天足够你熟练的上手编程了(其实在我看来一个晚上的学习时间已经足够)。学点新东西真的那么难吗?
学新技术并不是要逼你在项目当中立刻用上不可,但既然大家有时间泡JavaEye,我相信平时工作之余挤出时间学点新技术并不是啥为难的事情吧。而且随着你经验越来越丰富、知识越来越广博、学习的速度也会越来越快,一门新技术真正对你来说是新的知识是很少的,而正是这新的知识能给你带来很多新的思路。你学的越多,学的越快,就会发现单位学习成本越低,单位学习产出越大。反过来你越害怕学习,那你的单位学习成本越高,单位学习产出越小。
学新技术并不是要逼你在项目当中立刻用上不可,但既然大家有时间泡JavaEye,我相信平时工作之余挤出时间学点新技术并不是啥为难的事情吧。而且随着你经验越来越丰富、知识越来越广博、学习的速度也会越来越快,一门新技术真正对你来说是新的知识是很少的,而正是这新的知识能给你带来很多新的思路。你学的越多,学的越快,就会发现单位学习成本越低,单位学习产出越大。反过来你越害怕学习,那你的单位学习成本越高,单位学习产出越小。
2 我觉得学习对一个程序员来说很重要,真正花一些时间钻研一下,框架还是很容易学的,至少做到在实际项目中使用还是不难的。成本、学习曲线、性能、开发效率等等问题的确很重要,需要谨慎考虑。但是一个软件团队还是应该保持与时俱进,积极学习新技术的。存在即合理,SSH,ROR,Warp这些框架自然有其存在的道理,各有各的使用场合。
没有必要争论哪个更好,哪个更快之类的。多学一点总没有坏处的。
当初学习RoR的时候就期望Java能拥有一个简洁快速、开发效率高、不会让人陷入XML Hell的框架,现在我找到我的选择了。
准备好好学习了!
没有必要争论哪个更好,哪个更快之类的。多学一点总没有坏处的。
当初学习RoR的时候就期望Java能拥有一个简洁快速、开发效率高、不会让人陷入XML Hell的框架,现在我找到我的选择了。
准备好好学习了!
3 好的工匠应该精通一种工具的使用,而了解其他工具的使用。
不可能有哪个程序员什么都精通的,除非他不干活天天研究框架呀工具呀之类的。作为一个团队更是这样,试想一个几百人的开发队伍,今天用SSH,明天用ROR,后天又Warp...,就算程序员同意老板也不同意。如果综合考虑成本、学习曲线、性能、开发效率、可维护性(会用的人多)等方面,SSH仍然是目前最好的框架。不是每一个程序员都象robbin所说那样有很强的快速学习能力的,除非有一个团队,有50个LZ这样的大师...
不可能有哪个程序员什么都精通的,除非他不干活天天研究框架呀工具呀之类的。作为一个团队更是这样,试想一个几百人的开发队伍,今天用SSH,明天用ROR,后天又Warp...,就算程序员同意老板也不同意。如果综合考虑成本、学习曲线、性能、开发效率、可维护性(会用的人多)等方面,SSH仍然是目前最好的框架。不是每一个程序员都象robbin所说那样有很强的快速学习能力的,除非有一个团队,有50个LZ这样的大师...
4 开发效率肯定是Rails比Java要快的多,只不过开发效率并不一定是唯一的衡量因素,比方说程序员的编程语言熟悉程度、维护的成本都是要考虑的因素,所以最终用Java也不要觉得有啥不好意思的。
在一定要用Java的前提下,基于Google Guice/Warp显然要比Spring简单易用的多。
在一定要用Java的前提下,基于Google Guice/Warp显然要比Spring简单易用的多。
5 好的工匠精通各种工具的使用,他知道在什么情况下用什么工具适合做什么家具;
差的工匠永远只会手里拿着一把锤子,用这把锤子去锤所有的东西,你今天告诉他Java这把锤子做书柜好,他就拿Java这把锤子锤所有的家具,明天你告诉他Rails这把锤子做桌子好,他就把Java这把锤子扔掉,用Rails这把锤子锤所有的家具,后天你告诉他Java这把锤子做大衣柜很合适,他又把Rails锤子扔掉,一边用Java锤子锤桌子,一边疑惑的问你?你不是说要用Rails锤子的吗?怎么现在又用Java这把锤子了?然后他又不依不饶的问你,你给我比较比较究竟是Java锤子好用,还是Rails锤子好用?谁有前途,谁做家具的效率高?我究竟该用哪把锤子锤所有的家具呢,究竟该扔掉哪把锤子呢?
所以这种问题根本就是错误的问题,好的程序员要具备很强的快速学习能力,深入了解常用编程语言和框架优势劣势和适用的场景,然后根据实际情况去灵活的选择。而不是企图孤注一掷的寻找一种所谓的万金油编程语言,然后死抱着不放,企图用它干任何事情,眼睛里面容不下任何其他技术。
差的工匠永远只会手里拿着一把锤子,用这把锤子去锤所有的东西,你今天告诉他Java这把锤子做书柜好,他就拿Java这把锤子锤所有的家具,明天你告诉他Rails这把锤子做桌子好,他就把Java这把锤子扔掉,用Rails这把锤子锤所有的家具,后天你告诉他Java这把锤子做大衣柜很合适,他又把Rails锤子扔掉,一边用Java锤子锤桌子,一边疑惑的问你?你不是说要用Rails锤子的吗?怎么现在又用Java这把锤子了?然后他又不依不饶的问你,你给我比较比较究竟是Java锤子好用,还是Rails锤子好用?谁有前途,谁做家具的效率高?我究竟该用哪把锤子锤所有的家具呢,究竟该扔掉哪把锤子呢?
所以这种问题根本就是错误的问题,好的程序员要具备很强的快速学习能力,深入了解常用编程语言和框架优势劣势和适用的场景,然后根据实际情况去灵活的选择。而不是企图孤注一掷的寻找一种所谓的万金油编程语言,然后死抱着不放,企图用它干任何事情,眼睛里面容不下任何其他技术。
6 Spring在静态的配置文件当中描述bean的依赖关系(或者静态的Annotation),在某些情况下这是一个非常讨厌的限制,导致你很难在程序运行期修改或者创建bean的依赖关系。
比方说,你的程序根据某用户的操作,创建了quartz bean执行后台任务,这玩意你没办法事先在配置文件里面写死的,那你就麻烦大了,只能想办法自己写FactoryBean,在程序里面调用这个FactoryBean自己手工创建依赖。再例如你一个prototype的bean,在程序运行期创建的时候需要从程序里面传入一个构造器参数,这个参数可能来自你的业务逻辑,那你马上傻眼了,写FactoryBean吧,在程序里面自己create吧。类似这种情况还挺多的,Spring也就是管理Singleton的bean很好用,一旦涉及到prototype bean啥的,处处受限制。
所以这个IoC的玩意,你要在程序运行期玩花样,灵活起来,动态起来,Google Guice就比Spring好用不是一点半点。这就是为啥我推崇基于Google Guice的warp的原因,当然warp自己也有一些很不错的地方。
比方说,你的程序根据某用户的操作,创建了quartz bean执行后台任务,这玩意你没办法事先在配置文件里面写死的,那你就麻烦大了,只能想办法自己写FactoryBean,在程序里面调用这个FactoryBean自己手工创建依赖。再例如你一个prototype的bean,在程序运行期创建的时候需要从程序里面传入一个构造器参数,这个参数可能来自你的业务逻辑,那你马上傻眼了,写FactoryBean吧,在程序里面自己create吧。类似这种情况还挺多的,Spring也就是管理Singleton的bean很好用,一旦涉及到prototype bean啥的,处处受限制。
所以这个IoC的玩意,你要在程序运行期玩花样,灵活起来,动态起来,Google Guice就比Spring好用不是一点半点。这就是为啥我推崇基于Google Guice的warp的原因,当然warp自己也有一些很不错的地方。

