早在1990年,一些商业的ORM工具就出现了,比如TopLink。但由于其价格昂贵、结构复杂并且与Sun的实体bean标准相左,所以很少人会用。不管怎样,在持久化POJO方面,这些工具与JDBC和实体Bean相比确实有了很大的进步Java Data Object于2001年在Java Community Progress(www.jcp.org)的规范中出现。它为一般的POJO提供了大多数的持久化实现(尽管很多实现都是对关系数据库的)。但Sun公司以及其他的J2EE技术提供商对该技术表现的很冷淡。所以JDO也没有能够流行。
Hibernate的出现。ORM领域在2002年发生了大变化,原因有两个。首先,实体Beans在实践中失败,开发者们将其从J2EE中忽视掉了。它向开发者们说明了一个规范是如何将开发拉入泥潭的。
另外的一个原因是Hibernate的发布(www.hibernate.org),它是第一个功能健全的解决关系对象映射的解决方案。虽然在功能上,它没有TopLink多样。但在那些最常用的功能上,Hibernate实现的更加健壮,并且有一个非常专业的团队提供全职的开发。Hibernate并不是全新的,它的ORM思想在这个领域很普遍,但它提供的编程模型比其他任何竞争者都容易使用、都来的直接,它为ORM的使用提供了更加易用、廉价的途径。
与此同时,新一代的商业产品针对关系数据库提供了极其高效的JDO规范的实现。这样开发者的选择就更丰富了;还有,TopLink也朝着开发者友好的方向前进,它的liscense越来越开放了。
ORM大获全胜。所得这些因素使得ORM比以往更加规范。虽然很多项目仍然使用自己的持久层框架,但Hibernate,TopLink以及一些高端的JDO实现,使得使用自己持久层框架的难度相对变大、可维护性降低,自然,也没有什么理由去使用自己的框架了。
虽然这些J2EE开发框架的功能覆盖范围已经很大了,但仍有很多地方不在其中。比如,一个基于struts,hibernate的项目,业务逻辑很难搞定。尽管对于这种问题,J2EE规范提出了解决方案(EJB),但仍旧没有一个合适的编程模型。
Spring
J2EE开发框架被大规模地运用到项目中,而项目总要负责这些框架以及自己业务代码的连接,使之真正融合到一起。Spring就是专注于这个问题的,它和Hibernate融合的很好。
本质上讲,Spring是反向控制(IOC)和面向切面编程(AOP)的组合体。它是一个非侵入式的框架,增强了POJO的功能。从服务上讲(With a service abstraction),它将程序代码从J2EE环境解耦到普通的java对象(自然,这些代码可以脱离J2EE而在多种环境中运行)。它还在很多功能上提供了除EJB之外的选择--比如为所有的POJO提供声明式事务。Spring被广泛运用到很多项目中,从小的web程序到大的企业应用程序。
在这个领域还有其他的产品,比如HiveMind (http://jakarta.apache.org/hivemind)和NamoContainer (http://nanocontainer.codehaus.org)。前者和Spring的思想大致相同,只不过在IOC上有较大差异;后者将很多服务融合在PicoContainer的IOC容器中。这些产品的实现方式和J2EE的不同在于,它们都很轻便。
在有J2EE API下做测试是非常困难的,这些容器将POJO从J2EE API中脱离出来,从而大大降低了测试的难度。测试一个普通的java对象,不用象测试J2EE程序那样,得先将应用程序部署到服务器上,要不就得自己动手模拟J2EE环境。提供日益流行的测试驱动的开发环境(对于开发者来说这是应得的),是这些轻量容器流行的关键因素。
下一个将会是谁?
人们日益对开源框架的重视,使得很多项目的成本大大降低,并且投放使用以及维护速度都增加了。现在的开源框架都有很高的质量,都提供了很好的文档和一些书籍让开发者做参考。即便如此,两大因素使得J2EE领域充满了不确定性:开源领域和J2EE“标准”的冲突和AOP的日益重要。
开源和标准之间的冲突表现在两个地方。一个是表现层,JSF的身后有Sun公司和其他的一些大公司,而在这个领域有Struts等开源产品与之竞争。在中间层,EJB 3.0采用J2SE5.0的annotations实现了依赖注入(dependency injection)的功能,但这个功能只是Spring的一个子集。
在这两个领域,开源产品都更加革新。JSP借鉴了ASP.NET,而Tapestry(http://jakarta.apache.org/tapestry)则采用了WebObjects的思想。
同样的,不知道EJB3.0为何要尝试着标准化依赖注入,即使这样会使之不可避免地丧失很多功能。 EJB 3.0好像也要进入程序编写领域,而J2EE规范在这方面还没有涉足。
与此同时,AOP的重要性在J2EE社区猛增,在使用上,AOP也越来越受到开发者的青睐。像Spring、dynaop (http://dynaop. dev.java.net)等被称作“带着双拐的AOP”实现提升了AOP的知名度。而纯粹的AOP技术比如AspectJ,在将来的几年也会流行起来。
其次,JBoss (www.jboss.com)通过JCP和EJB3.0保持一致,它极大地推动了AOP技术。但即使如此,JCP 还没有转向AOP迹象。
下一代的J2EE规范将拥抱更简单的POJO编程模型,就像Spring和Hibernate这两个J2EE开发框架做的一样。J2EE开发者也注定要从“欺诈客户”转到以自己的编程经验开发上来。这次改变将受到大多数人的欢迎,不像以前那样每一个新规范发布后,最终都没有能很好的实现。
【编辑推荐】