头一次听有人认为“配置编程”是好东西。
实际上,很快就会被淘汰的,正是“配置编程”,包括它的代表 SPRING。基于XML的配置编程,本来是一个不得已而为止的办法,而不是什么高超优雅的设计。在ANNOTATION出现以前,人们曾经用XDOCLET来减少配置项目的数量。EJB3 直接在 JAVA 代码里以 ANNOTATION 的方式实现依赖注射,包括资源依赖和组件依赖。与配置编程相比,这不但大大提高了工作效率,更遵循单一代码原则,减少维护对象数目。
“配置编程”有一些致命的问题:
首先,一个完整的功能必须由多项文件共同支撑。增加了BUG几率。
更重要和更本质的问题,是“配置编程”破坏了OO的封装原则,把属于对象内部实现细节的依赖关系暴露在配置文件里。由于配置文件是在生产环境下可以更改的,这就从根本上破坏了组件设计者对组件部署环境的控制。维护和支持过套装软件产品的技术人员大概会有体会:把产品完整性寄托于明文的配置文件上,等于自讨苦吃。
关于 SPRING 和配置编程的前景,JBOSS的架构师/写手/传教士,ENTERPRISE J2ME的作者,MICHAEL YUAN最近曾经著文评论过。由于“配置编程”而喜欢上SPRING的各位同仁,该是看看EJB3的时候了。
SPRING 的几个大卖点,依赖注射,声明式事务控制,EJB3 都以规范的形式加以支持。并且,由于充分利用 JAVA5 语言层面的特性(主要是ANNOTATION),EJB3 对这些功能支持更加优雅方便。SPRING的MVC层,对于有JSF开发工具的程序员来讲,更没有什么吸引力。
SPRING 比 EJB3 强出的唯一一个方面是 AOP。EJB3 支持 INTERCEPTOR,但是仅此而已。ROD JOHNSON 和 IBM 明显已经意识到了这一点。这就解释了 ASPECTJ 的头头为什么最近从IBM投奔了INTERFACE21。
说 JAVA 要被淘汰,并不是说 JAVA 就要完全消失了,而是说编程语言将进一步细化,单独出业务应用语言和系统框架语言。这就类似当年从汇编里分离出来了C, 有进一步分离出 C++, 然后再次分离出JAVA/C一样。
说JAVA会完全消失,就好像说C/C++/数据库会灭亡一样。即使在今天,LINUX KERNEL还是要用汇编+C写,不是吗?
编程语言将再次细化分工的原因,和以前的几次一样,是计算机工业生产力发展的必然规律。 记得当年的C/C++程序员都对JAVA有强烈的排斥和轻蔑心理。很多人认为一个不能访问内存地址和IO端口的语言充其量只能叫做玩具。 但是事实是,JAVA 所试图解决的问题,并不是硬件系统操作和资源管理,而是抽象的OO逻辑表达。站在系统和资源层面看待JAVA,当然不会相信有一天JAVA会取代C++成为用户群最大的语言。
今天的JAVA面临当年C/C++类似的问题:同一个语言被赋予了多种角色。 对于占程序员绝大多数的 应用开发者 而言,JAVA 是一种业务逻辑描述语言。应用开发者所关心的问题,是如何在最小的代价下最准确忠实地完成业务功能需求。站在这个层面上,JAVA提供了过多的灵活性: 比如 Thread/ThreadLocal 出现在JDK里,在 J2EE规范 却禁止应用程序使用这些API。又比如 SWING,或者现在流行的 AJAX & JSF|STRUTS|WEBWORKS,写商业应用图形界面并不比VB/POWERBUILDER/DELPHI简单。虽然J2EE规范努力试图弥补 JAVA 功能 和 商业应用需求之间的差距,这个过程却不是一帆风顺的。现在已经出现了几个JAVA技术栈的替代品,不如 RUBY ON RAILS,PHP。
作为 JAVA 程序员,在你嘲笑这些东西简陋之前,记住当年C/C++的前车之鉴。
另一方面,而对于WEBLOGIC, JBOSS, WEBSPHERE, GERONIMO, APUSIC而言,JAVA被用来实现所谓“容器”,“商业操作系统”。在这个层面上,JAVA 的语言设计很多地方显得捉襟见肘。 比如,AOP 是一个系统编程的极其自然的设计方案。在系统安全,授权,认证,事务,日志等等方面都可以作为非常优雅的架构选择。事实上,APUSIC,WEBLOGIC, JBOSS也的确用不同的方式各自实现了自己的AOP,IBM更是ASPECTJ的大力支持者。 然而,SUN 出于保持 JAVA 语言简单特性的考虑,坚持不在 JAVA 语言中加入 AOP 特征。
这种情况不会持续下去的。
历史经验表明,“模式”“框架”只是过渡状态。短短几年时间中,大多数“J2EE 核心模式”已经结晶成为几个“框架”,或者J2EE技术规范。然而,“框架”并不是这个过程的终点。正如同 win32 SDK -> MFC/OWL -> VB/DELPHI/PB 一样,EJB3/SPRING 以后必然会出现在更高层面上进行抽象的语言。
所以,JAVA最终必然将在应用开发者和系统开发者中选择其一。目前看来最可能的情况是将产生另一个应用开发语言。