在当今企业平台开发中JAVA是领先技术。由于管理需要越来越多的技术,复杂的结构似乎爆炸式的增长,留下了大师们没有银弹的慨叹。这些复杂结构可以从J2EE规范的快速更新中看出来。复杂的规范、协议和技术使我们迫切期望获得更简易的解决方案。
我想大家马上就会想到开源工具。是的,开源框架为我们提供了低成本、高效率、轻量级解决方式。 JAVA是开源项目最集中的阵营,但提到开源项目也是仁者见仁,智者见智,其中苦乐也是如鱼引水,冷暖自知。
开源圣地藏龙卧虎,仿佛那些Java高手如鱼得水,找到了显示才华的沃土。单单MVC框架就是每星期一个,用惯了struts的朋友不知道是什么感想,架构设计人员仿佛有了更多的选择,但实际情况并没有因为开源项目的欣欣向荣而给他们带来鱼和熊掌的无奈。因为程序毕竟是人写的,是给人用的。框架作为工具的可能性远远大于将其作为研究对象。
一大堆英文缩写和概念让我们这些刚接触开源框架的朋友们,确实有些芒刺在背,不知从何入手。其实在真正深入研究这些框架如何工作和如何使用之前,最好先分析一下你要解决的问题到底是什么,用了某个框架之后,或是提高了生产率,或是得到了健壮的框架还是灵活性和可扩展性。而你(或者是你的老板)关注的到底是什么。只有确实解决了问题的方案才是好方案。
我用了两个月左右的时间学习了ant、Junit、Mock、hibernate、webwork、xDoclet和spring等开源"名作",呵呵是不是有些夸张。虽有囫囵吞枣的之嫌,但确实过足了开源瘾,收获不少。个人认为学习开源框架,关键在于领会框架的中心模式。比如struts中的MVC、spring中的DI和hibernate中的ORM是如何体现的。在此感谢夏昕为我们献上的《指南》系列,使我们这些功力尚浅的鸟们认识到了这些名作的闪光之处。
现在我按照表现层、逻辑层、集成层和开发工具的顺序来给大家简单介绍一下这些通用开源框架的特点和我的一些学习心得。
一、STRUTS--我是不是该悄悄地走
面对Struts,我们的心情很复杂,它曾经是开启了我们MVC模式的导师,现在仍稳居国内期望学习Java框架排行榜首位,各大Java培训机构之必备良方。可惜其架构被证明存在缺撼,笔者虽然初识struts时也算倾心,但没过多久便找到了自己的最爱--webwork。关于struts的文章可谓铺天盖地,我就不在次弄斧了。
二、WEBWORK--当你孤单你会想起谁
作为MVC的另一种实现框架,它没有得到先入为主的优势。沉寂了多年的webwork一直延续着自己的梦,相信自己还是有自己的忠实粉丝(fans)。的确,我就是webwork的一位忠实fans。虽然学习的时候感觉比struts困难一些,但是每一个单元标题都能紧紧抓住俺的眼球J。结果就是她让这样一个追求完美的我移情别恋了。 Webwork最让我着迷的是她的前端数据封装和DI的xwork框架。虽然后者spring更擅长,但是对于初次了解DI的朋友还是推荐xwork,简约而不简单,呵呵。还有就是她的action控制模式很像EJB里的会话门面或无状态会话BEAN。但是她的不简单也有让我为难的时候,是在选择逻辑层框架时,xwork的实现和spring有些重叠,最后自己总结了一下:如果逻辑层足够简单,数据持久化范围也不大的情况下选择xwork,否则选择spring,毕竟spring里集成了hibernate的实现,这样运用hibernate更自然。 支持webwork的开发者们,当你们孤单时,别忘记我们这些忠实的fans,相信你总有灿烂的明天。
三、SPRING--问天下谁与争锋
在Java开源社区,自Spring出现以来,可谓名声雀起,其作者接连出书,在诛伐EJB的罪与罚过程中出力不小。在流行的开源框架组合中,Spring往往处于中心地位。加上自身的不断努力,在开源大行其道的JAVA社区大有舍我其谁、君临天下之势。 我感觉其实spring的成功很大程度上还是来源于J2EE的成功,和那些大师们对开发者需求的认识上,毕竟开发者也是人,有谁愿意整天研究那厚厚的J2EE规范,况且还是天天在变的东西。结果脱离容器的spring以其灵活的结构和强大的可以和一般EJB相媲美的性能吸引了大量追随者。 其实spring的模式很大程度上是EJB里充分利用脱离容器的context上下文的体现。它对DI(依赖注入)的实现比webwork更深入,比如引入了消息监听机制。相信不久的将来功能更加强大之后,必然强迫EJB的更新。
四、HIBERNATE--让我欢喜让我忧
hibernate是我在JDBC之后接触的第一个ORM模型。给我的最初印象就是能省略很长SQL语句的东西。后来才认识到hibernate对对象模型的体现,不论是关联、聚合、组合、多态还是继承,它都有很好的实现机制。而这些关系都是隐含在代码中的,实现的持久化也是人为来判断实体关系,相信它也是迈向对象数据库的一个很好的过渡。 对于我这个对SQL不是很擅长的鸟类成员,hibernate让我有了更自然的和DB交互的语言。但是每件利器都是双刃的,用不好往往会影响系统性能。比如缓存机制,延迟加载,不能合理处理都会造成内存不足,还有就是查询语句的合理运用。JVM的内存设置一般都是固定的,性能是应该优先考虑的东西。有时候如果实体设计不当,造成关联过于复杂,数据持久就会很难处理。所以才会有很多朋友发出hibernate不如JDBC的感慨。
五、JUNIT--忠实的守护
自动地、密集地单元测试是防守(重构,防止回归错误)的关键法门。对于当前多变的客户需求也许XP是最好的开发方式。不过听大哥们说过国内XP很少,所以只好借鉴一些XP的策略,比如测试驱动开发(TDD)。测试的好处我就不多说了,说白了就是给自己程序做个守护,防止开发过程的变化影响其它程序。 自动测试化测试的最大好处就在于可以加快迭代的频率,因为每个部件都保证是正常工作的,整体也是这样的,当然就可以进入下一次迭代了。Junit的强大还在于在它基础上产生的其他测试技术。例如和MOCK结合产生的测试程序交互的框架。Jmeter是在它基础上产生的用于测试系统整体性能的。 还有就是测试技术的发展对软件开发模式的影响,方便快捷的测试使大部分开发者们舍得花时间写测试来保证自己的代码质量,进而影响开发方式,比如TDD的运用。学习Junit有时候感觉是一件烦琐的事情,毕竟要写的代码增加了一倍。但是当你把一大堆的测试用例合成一个套件时,一个命令就能断言自己的程序没有问题。多么有说服,呵呵。
六、XDOCLET--"懒人"的工具
xDoclet是一种通过读取JAVA源文件中的特定标签,然后生成指定文件的工具。xDoclet标签本身已经提供了一些常用的标签,例如ejb,hibernate,web等等。 我是在学习HIBERNATE时接触xDoclet的,复杂的ORM配置文件一直是大家比较头疼的东西。有了xDoclet,就方便多了,有Java DOC运用经验的朋友可以很快进行开发。我认为用xDoclet主要的工作就是记住一些标签的用法。至于怎么用,现在已经有MYECLIPSE支持了,我个人认为最好的用法还是通过ant的target运行它。
七、ANT--一只聪明的蚂蚁
项目的构建不能依赖于IDE的特殊格式,有很多的task辅助,ant提供给我们一个融合的方式。 Apache Ant是一个基于Java的生成工具。是Another Neat Tool的缩写。与基于shell命令的扩展模式不同,Ant用Java的类来扩展。(用户)不必编写shell命令,配置文件是基于XML的,通过调用target树,就可执行各种task。每个task由实现了一个实现了特定Task接口的对象来运行。 说到ant,肯定会有一些IDE高手们对它嗤之以鼻,"长篇的build配置文件还不如我一个快捷键来的省事"。是的在某些方面ant确实不如IDE来得省事。但是如果涉及到一连串的操作执行,没有宏功能的IDE就不如ant了。还有就是运用ant不必依赖于特定IDE,比如笔者就喜欢自己的开发目录结构,可惜没有一个流行的IDE支持这种目录结构。所以最后只能给他们分工了。 一般IDE和ant的优势是可以互补的,比如作为编译源代码、运行单元测试IDE应该更方便。而产生Java DOC和测试报告、构建.war文件和部署应用,ant更适合。
最后,让我来总结一下这篇不短的废话(总感觉自己在说些废话)。所谓工欲善其事,必先利其器。有了这些开源功臣为我们献上的一件件利器,我们确实仿佛成了武林高手。但是要成为剑客必须做到人剑合一,这里也就是说要做到随心而动,不强制自己为了运用框架而运用它。如果我的这篇文章耽误了您的一杯咖啡的时间,请见谅。或者如果有同感或异议,欢迎交流