--java就是厉害啊,总是让自己来否定自己。。。。。。别人的否定根本就无效。。。。
三化盖顶,让J2EE更敏捷
http://blog.csdn.net/Apusiczhang/archive/2007/03/16/1531458.aspx
我常常在思考:这就是21世纪的J2EE开发现状,甚至有时会怀念VB、Delphi、PB等传统技术。
在J2EE技术体系中,往往被灌输了太多容器的概念,什么EJB容器、Servlet容器等等,而开发过程也在开发、配置、部署之间迭代与反复;如此一来常会出现令人尴尬的状况:往往花几分钟时间去改一个Bug、却要再花双倍或者更多时间去部署和测试,开发工程师们不得不中断思路,看着服务器如蜗牛般启动,并在开发工具和部署工具之间来回切换。
事实上,配置也好、部署也罢,都是开发过程中一个必不可少的阶段。如何通过集成式的开发环境将这些开发阶段有机集成在一起,是摆在我们面前的迫切需要。在本文中,我将阐述一种"轻量级"开发的理念,以及如何实现该理念的Apusic Platform平台,它包括应用服务器和Studio开发平台。
技术模型简单化
J2EE发展到今天,一种普遍的看法是:开源社区的蓬勃发展给J2EE官方标准带来很大的冲击,甚至于部分开发者对Java EE 5.0的权威性都产生了质疑,并对Java EE 5.0 是否能够占据主流开发平台地位产生了顾虑。
事实上,我认为,开源社区与J2EE之间更多的是一种相辅相承的关系。开源代表的经常是理想主义,而商业公司代表的经常是现实主义,两者之间有相互竞争的地方,但从长远来看,更多的是一种是相互补充、相互促进的过程。
在Apusic Platform的实现上,一方面对各种开源技术予以非常大的支持,包括Struts、Hibernate、Spring等;不仅提供一系列的示例样板,以演示如何在Apusic应用服务器上使用这些开源组件,甚至还提供这些开源框架的商业支持,以更好地推动这些开源技术在国内的推广与使用。
Java EE中最引人注目的恐怕是EJB 3和JSF了,EJB 3克服了EJB 2.x版本的很多不足与缺陷,使EJB技术真正成为企业应用的主要计算模型,为EJB的全面普及奠定了理论上的基础。而JSF则是Java EE试图解决Web应用开发的主要解决方案。我们即将推出的Apusic JSF则融合了JSF与Ajax技术,克服了常规JSF实现的弊端,使JSF成为一种轻量级的Web开发模型。目前,我们正试图将Apusic JSF以开源的形式反馈给国内的广大Web开发人员,并期望围绕Apusic JSF形成一个丰富的Web UI组件市场,从而彻底解决目前Web应用开发的主要不足。
开发过程一体化
以一个简单的Web应用开发为例,在Apusic Studio中,可以通过jsp编辑器提供的语法加亮、代码辅助、断点调试等功能,非常方便的辅助开发人员快速完成web页面的开发;还可以通过可视化的配置界面,完成繁琐的web/ejb/ear等配置信息。
当要运行某一个页面时,只需点击一下右键菜?quot;在Apusic应用服务器上调试",Apusic Studio就会自动帮助我们做这样一系列动作:首先判断应用服务器是否已经运行(倘若没有运行就会自动新建一个启动配置项,设置好类路径启动应用服务器),然后判断应用是否已经部署(倘若没有部署就会自动部署应用),最后自动打开浏览器,运行指定的jsp页面,甚至于Apusic Studio还能够感应到应用发生的变化,在应用需要重新部署时自动部署。
业务组件实用化
回顾J2EE技术体系,甚至于诸多流行的开源框架,我们不难看出,它们所解决的问题无一例外的都集中在软件模型本身:譬如OR Mapping、AOP、MVC等。而现实中的应用系统的开发者,希望能通过某种业务开始平台或者某些通用的业务组件,屏蔽这些底层的实现技术,从而使他们聚焦于业务本身。
但是,由于业务组件缺乏相应的规范与标准,导致它们的实用性与可用性不高。这一方面来源自业务系统本身的需求复杂度与可变性,另外一方面则缺少一个类似于JCP的组织,去制定并发展这些业务组件的规范与标准。
Apusic Platform试图提供另外一种选择:通过一种可插拔可替换的机制,打造实用程度较高的业务组件,譬如组织架构、权限模型、报表打印等。这些业务组件,融合了金蝶公司及其合作伙伴多年的应用开发智慧结晶,能够给业务系统开发人员带来实实在在的方便。
轻量级的两层含义
何谓轻量级?在我看来,轻量级包含两层含义。一是运行期的轻量级:在完成相同的运算任务下消耗最少的系统资源;二是开发期的轻量级,指开发过程的敏捷以及快速响应能力。
运行期的轻量级可以说在以微内核体系为核心、代码量仅为同类软件20%的Apusic应用服务器上得到了极佳验证:无论是启动速度,还是运行期所消耗的系统资源,Apusic都大幅度领先,也许业界唯一能够与之比较的只有Tomcat了。但Tomcat仅仅是一个Web容器,而Apusic应用服务器则是全面实现J2EE 1.4规范的企业级产品(今年5月份已经全面实现Java EE 5.0规范),至于而运行期的健壮性与稳定性,Apusic在各项指标上与国外同类软件不相上下。
开发期的轻量级,我们可以通过与Apusic应用服务器紧密集成的开发工具Apusic Studio获得开发过程的敏捷性。无论是编码、配置、部署与测试,还是后期的监控与性能调优,我们都可以通过Apusic Studio获得一体化的支持。
让J2EE开发更轻松
开发过程一体化,使开发人员无需再考虑部署、配置等琐碎过程,也不需中断思路忍受服务器反复启动的煎熬;技术模型简单化,通过优秀简单的技术解决现实中复杂的问题;业务组件实用化,能够摆脱某些具体实现细节,聚焦于业务逻辑本身。
以上的理念,我称之为类似武侠小说中高手练功到一定层次的"三化盖顶",它很大程度上解放了J2EE,让我们拥有开发过程中的敏捷与愉悦。
敏捷快速,让J2EE开发更轻松,为什么不呢?
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1531458
我们为什么需要Java EE 5.0?
http://blog.csdn.net/Apusiczhang/archive/2007/03/16/1531466.aspx
我们为什么需要Java EE 5.0?
作为主流中间件技术标准J2EE诞生6年后的下一代企业级开发规范,Java EE 5.0从一开始就倍受关注,引发了无数辩论和众多期盼。它重点关注目前Java应用开发的热点:运行可靠性、开发效率、扩展灵活性及企业应用整合,顺应轻量级、简单化趋势,给开发者和企业带来真正的实惠。
什么是Java EE 5.0?
“Do more with less work”,这是Java EE 5.0的正式宣言,也是其与J2EE 1.4最显著的区别。Java EE 5.0提供了诸多新特性以简化应用的开发,譬如:
通过Annotation代替旧有的xml配置文件;l
重新设计的EJBl 3.0变得轻量与简单;
基于组件化的JSF Web编程模型;l
与JAX-RPC相比更易使用的JAX-WS等Webl Services相关规范;
拥有了诸如依赖注入、AOP编程等以往开源框架才拥有的功能等等。l
图中蓝底白字部分是Java EE 5新的功能,从下图可以看到,在WEB层加入了JSF这个新的表现层框架。EJB从EJB2.0升级到EJB3.0。Java 5.0还加入了Annotations,通过Annotations引入,降低Java EE开发成本。
Java EE 5.0架构图
为什么我们还需要Java EE 5.0?
在谈论Java EE 5.0众多新特性的时候,我们面对这样一个问题:在J2EE 1.4依然占据主流开发地位,并且除官方标准以外,还拥有很多丰富的开源框架可供选择的今天,为什么我们还需要Java EE 5.0?
首先,作为官方标准的J2EE 1.4,是一种过度理论化的计算模型,无论是开发效率还是运行期性能,都已经日显老态;其次,在诸多开源框架的冲击下,J2EE 1.4的功能局限性也日益暴露出来,譬如:与Entity Bean相比,Hibernate提供了更好的OR Mapping解决方案;与Session Bean相比,Spring Framework对Bean的管理更简单,更高效,功能也更丰富;与单纯的JSP/Servlet相比,Struts、WebWork能够在更高层次上解决Web开发的复杂度问题。
人们是智慧的,业界既需要代表现实主义的官方标准和商业软件的存在,也同时需要代表理想主义的开源组织和开源软件的存在。尤其是在Java EE 越来越 Open的今天,我们甚至已经忽略了哪些特性是官方标准应该具备的、哪些特性是开源软件应该具有的。事实上,整个业界都在迫切等待下一代J2EE规范的诞生,而一旦该规范诞生,它将汇集整个业界的智慧,融合已有开源框架的优秀特性,并使商业软件或开源软件迅速向其靠拢。而它,就是Java EE 5.0!
Java EE 5.0新特性介绍
Annotationn
Annotation中文意为标注,是JDK 1.5中引入的非常迷人的特性之一,通过在Java代码加入元信息(Meta Data),影响工具和库对代码的处理。在Java EE 5中,增加了在POJO(Plain Old Java Object)中进行Annotation功能。Annotation可以用于:
l 定义和使用Web Service
开发EJB组件l
映射Java类到XMLl
映射Java类到DBl
l 指定外部依赖
l 指定部署信息,包括安全属性等
有了Annotation,XML部署描述符不再是必须的,应用的打包从而变得简单起来,如我们熟知的WAR应用中的WEB-INF/web.xml将不再需要,部署信息通过Annotation进行表述,应用部署更加灵活。
下面是Java EE 5中使用Annotation定义Web Service的一个例子:
package endpoint;
import javax.jws.WebService;
@WebService
public class Hello {
public String sayHello(String param) {
return “Hello “ + param;
}
}
一个普通的Java类,通过加入@WebService这一Annotation,服务器就可将此类中的公共方法发布为Web Service,简单又方便。
引入Annotations可以大大降低Java EE开发成本,开发更适应中小型系统的开发,简化这部分系统开发步骤。
n EJB3.0
EJB3.0是对重载的EJB2的批判性思考和扬弃。在EJB3.0中,不再需要EJB home接口,也不需要实现javax.ejb.SessionBean接口,一个简单的POJO对象就足于代表实体对象,并支持继承和多态。同时,困扰人们多年的EJB部署描述符变成可选的。EJB的持久变得更加简化、轻量级,EJB的查找也变得更加简便,JNDI API不再是必须的。EJB3.0还使用了Interceptor,在业务方法被调用前进行拦截,因而更加容易实现灵活的AOP编程。
n JavaServer Faces 1.2
JavaServer Faces (JSF) 是一种用于构建 Web 应用程序的新标准 Java 框架。它提供了一种以组件为中心来开发 Java Web 用户界面的方法,从而简化了开发。JSF提供了标准的编程接口、丰富可扩展的UI组件库、事件驱动模型等一套完整的Web应用框架。通过 JSF ,可以在页面中轻松自如地使用 WEB 组件、捕获用户行为所产生的事件、执行验证、建立页面导航等。JSF1.2支持
l 托管Bean中的依赖注入
简单易用,功能强大,支持扩展的表达式语言l
大量的JSF组件l
支持AJAXl
n JAX-WS2.0, JAXB2.0:更简单、更广泛的Web Service支持
Java EE 5提供了更简单、更广泛的Web Service支持,包括:
JSR 224, Java API for XML-Based Web Services (JAX-WS)l 2.0
JSR 222, Java Architecture for XML Binding (JAXB) 2.0l
JSRl 181, Web Services Metadata for the Java Platform 2.0
SOAP withl Attachments API for Java (SAAJ) 1.3
JAX-WS 2.0继承自JAX-RPC 1.1,实现更简单的编程模型并集成JAXB 2.0,支持可扩展的传输协议,支持支持异步客户端,并支持REST应用。
JAXB2.0全面支持XML Schema,能够绑定Java类到XML Schema,支持更小的内存占用和更快的编组(marshalling)、更灵活的编出(unmarshalling),支持局部绑定 XML文档到 JAXB 对象。
一个基于JAX-WS 2.0的HelloWorld例子如下:
package endpoint;
import javax.jws.WebService;
import javax.jws.WebMethod;
@WebService()
public class HelloWorld{
//the implementation class must have a default public constructor
public HelloWorld() {};
@WebMethod(operationName="sayHello", action="urn:SayHello")
public String sayHello(String name){
return "Hello "+ name + "!";
}
}
上例中,只需要一个实现类,并通过使用annotations,将自动生成SEI和其他一些文件,开发人员从此可以将精力集中在业务逻辑的实现上。
n 依赖注入
通过依赖注入更容易访问资源。可注入的资源包括:
SessionContextl
DataSourcesl
Other EJBl
Web services,l
messagel queues等
一个依赖注入的例子:
package com.example;
@Session
public class MyEJB {
@Resource(name = “employeeDatabase”)
private DataSource myDS;
...
}
上述代码片断定义了名为MyEJB的Session Bean,并定义了一个名为employeeDatabase的资源,将其注入到一个名为myDS的字段。通过依赖注入,不再需要复杂的部署描述符入口,事情就这么简单。
n 轻量级Java持久API模型
Java 持久API(JPA)也是Java EE 5中的一大亮点,这是个轻量级的持久模型。
在JPA中,实体是 POJO对象。实体对象不再是组件,也不再需要位于 EJB 模块中。另外,对象关系映射的处理方式也得以标准化,可以通过使用标注来指定对象关系映射信息,同时向下兼容 XML 描述符。
在JPA中,支持命名查询,通过元数据表示的静态查询。重用查询变得非常简单。
JPA支持简单的打包规则。由于实体 Bean 是简单的 Java 技术类,因此几乎可以在 Java EE 应用程序中的任意位置将其打包。例如,实体 Bean 可以是 EJB JAR、应用程序客户端 JAR、WEB-INF/lib、WEB-INF/classes 的一部分。
JPA支持分离的实体。由于实体 Bean 是 POJO,因此可以对它们执行序列化,通过网络将其发送到其他地址空间,并在不识别持久性的环境中使用它们。
JPA提供EntityManager API。可以通过标准 EntityManager API 来执行涉及实体的创建、读取、更新和删除 (Create Read Update Delete, CRUD) 操作。通过EntityManager API,编程将变得非常简便。
泛型(Generics)n
Jav EE 5之前一个集合可以放任何类型的对象,相应地从集合里面拿对象的时候我们也不得不对他们进行强制得类型转换。
现在Java EE 5引入了泛型,它允许指定集合里元素的类型,这样你可以得到强类型在编译时刻进行类型检查的好处,发现类型不符,避免到运行时出现类型转换错误,不再需要显式的强制转换(cast)。
举例如下:
使用泛型前:
ArrayList list = new ArrayList();
list.add(0, new Integer(42));
int total = ((Integer)list.get(0)).intValue();
使用泛型后:
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, new Integer(42));
int total = list.get(0).intValue();
自动装箱(Autoboxing)和自动拆箱(Auto-Unboxing)n
Jav EE 5之前,集合不能存放基本类型,简单数据类型(int,long,float等)和其对应的包装类型(Integer,Long,Float等)之间不能自动转换。
现在自动转换机制(自动装箱(Autoboxing)和自动拆箱(Auto-unboxing))解决了这些问题。自动装箱(Autoboxing)特性让Java自动包装一个简单数据类型(例如int)到对应的包装类型中(例如Integer)中。自动拆箱(Auto-unboxing)是相反的过程,即将一个包装类型(例如Integer)自动转换为它所对应的简单数据类型(例如int)。
举例如下:
以前:
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, new Integer(42));
int total = (list.get(0)).intValue();
以后(请对照泛型部分使用泛型前的例子代码):
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, 42);
int total = list.get(0);
枚举(Enumeration)n
Jav EE 5之前,枚举类型没有加入到Java中来,导致我们在程序中写了许多public static final。
现在加入了一个全新类型的“类”-枚举类型。本质上,一个枚举是一个命名常量的列表。枚举类型通过新的关键字enum来支持。下面是定义一个枚举的例子代码:
public enum Color
{
Red,
White,
Blue
}
然后可以这样来使用Color myColor = Color.Red.
枚举类型还提供了两个有用的静态方法values()和valueOf(). 我们可以很方便地
使用它们,例如
for (Color c : Color.values())了System.out.println(c);
n 增强的for循环
Java 5.0中添加了“For-Each”形式的循环。For-Each循环的加入简化了集合的遍历,为大量集合、数组等的循环处理提供了便利,并为我们防止数组越界提供有益的帮助,还避免了原来必需的强制类型转换(case),让我们能在编译时就发现类型不符,避免到运行时出现类型转换错误。
假设我们要遍历一个集合对其中的元素进行一些处理。典型的代码为:
void processAll(Collection c){
for(Iterator i=c.iterator(); i.hasNext();){
MyClass myObject = (MyClass)i.next();
myObject.process();
}
}
使用For-Each循环,我们可以把代码改写成:
void processAll(Collection c){
for (MyClass myObject :c)
myObject.process();
}
这段代码要比上面清晰许多,并且避免了强制类型转换。
n 不定参数(Varargs)
Varargs使程序员可以声明一个接受可变数目参数的方法。在过去,经常采用将参数包装到一个数组或者集合中的方式。Varargs让一个方法可以带有可变数目参数。Varargs的加入使得创建带有可变数目参数的方法变的更加容易。下面是使用不定参数的例子:
// 方法定义
void argtest(Object ... args) {
for (int i=0;i <args.length; i++) {
}
}
// 调用方式
argtest("test", "data");
n 静态导入(Static Import)
过去使用静态成员通常我们需要进行这种形式的调用:YourClassName.staticMember,在每次使用静态成员的时候我们都要把这个静态成员所属类的名字写一遍。现在静态导入可以让我们不必每次都去写类的名字了,可以直接通过静态成员的名字来访问它们,无需再给出他们的类名。下面是使用静态导入的例子:
// 静态导入
import static java.awt.BorderLayout.*;
// 调用静态成员
getContentPane().add(new JPanel(), CENTER);
n 元数据(Metadata)
新的元数据工具更多是为未来考虑而增加的,它让你能够在程序中嵌入注解(annotation),这些注解能够被不同的编程工具处理。例如,工具可以根据注解(annotation)的要求生成Java源代码,这样只要程序员指定一种动作,然后就可以将实际提供代码的事情留给工具了,从而大大降低了程序员必须手工输入的重复代码的数量。
下面是使用元数据前后的代码对比:
使用前:
public interface PingIF extends Remote {
public void ping() throws RemoteException;
}
public class Ping implements PingIF {
public void ping() {
……
}
}
使用后:
public class Ping {
public @remote void ping() {
……
}
}
其它改变n
Java 5在基础类库、用户界面、虚拟机、执行效率、垃圾收集等其它方面也进行了大量的升级。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1531466