内容


三、二、一 …… Geronimo!,第 1 部分

让 J2EE 编程更加简单

Apache Geronimo 中的企业容器类

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: 三、二、一 …… Geronimo!,第 1 部分

敬请期待该系列的后续内容。

此内容是该系列的一部分:三、二、一 …… Geronimo!,第 1 部分

敬请期待该系列的后续内容。

J2EE 是一个不依赖于平台的环境,设计这个环境是为了开发和配置在企业范围内使用的基于网络的应用程序。这个平台曾被喻为元语言或语言超集。但在本质上,J2EE 仅仅是 Java 编程语言和一些特定的 Java 类的最小集合。(参见 参考资料 中 J2EE 类文档的链接。)

J2EE 由用于开发多层且基于网络的应用程序的应用编程接口(API)、服务以及协议组成。它是一个复杂的标准,要想写一篇使之简化的文章,其难度不亚于撰写一篇简化联邦税务代码的文章,这可不是一件容易的事。但是,让我们从它的一些基本原则开始讲起,直至少量的实现细节,整个旅程还是会让您有所启发的。现在扣紧安全带,让我们开始吧!

基本原则

J2EE 多层设计中的客户机层是由纯 HTML 协议表示的,这些 HTML 由 JavaServer Pages(JSP)和 Java servlet 生成,并用传输协议(当然是 TCP/IP)潜在地部署多个 Java 小程序。任何符合标准的 Web 浏览器都能够作为 J2EE 系统的客户机正常运行。

服务器层包含 Enterprise JavaBean(EJB)技术,用这些技术定义了企业应用程序的平台逻辑。EJB 服务器提供线程管理、并发管理、内存管理以及安全方面的功能,并自动完成这些任务,以便于应用程序程序员摆脱这些细节方面的负担。这就是 J2EE 设计的威力所在。

处在最底层的是企业珍贵数据的核心,在这里,可以通过 Java 数据库连接(Java Database Connectivity,JDBC)接口访问标准的数据库工具,如 IBM® DB2®、Oracle、MySQL 或任何数量的基于结构化查询语言(Structured Query Language,SQL)的其他数据库引擎。

J2EE 的全部都是关于定义 Web 服务的 —— 对于定义动态页面的方式而言这是一个很不错的名字,在这种方式下程序动态地生成网页,而不是仅向进行调用的客户机浏览器返回一般的 HTML 文本文件。J2EE 是一个真正的各种技术缩写词的大杂烩,每种技术用一个容易记住的缩写词来描述。作为程序员,您不需要苛求自己掌握所有这些技术以在 J2EE 环境中成就辉煌的事业,但是您只要学到更多这方面的知识,就能够使您的事业获益。

快速参考:J2EE 技术

接下来要介绍的是对众多 J2EE 技术中某些技术的一个快速参考。掌握了所有这些技术的程序员在如今的职场上需求极旺。这些技术如此受欢迎,我认为这是由于它们的重要性以及部署的简单性,当然,这纯粹是我主观的观点。

我提供这份清单既是为了解释 J2EE 的复杂性,也是为了提供一份帮助您继续学习这些技术的粗略的地图。重要的技术包括:

  • JSP: HTML 模板的文件,该文件含有在执行前编译成 servlet 的内嵌的 Java 代码。
  • EJB: 代表了企业 Web 应用程序的平台逻辑。EJB 技术的两种类型是实体 bean会话 bean
  • JDBC: 一个用于从 Java 环境连接到数据库的 API。它是 Java 程序员针对开放数据库连接(Open Database Connectivity,ODBC)的替代品。
  • XML 处理的 Java API(Java API for XML Processing,JAXP): 用于协助应用程序分析及转换 XML 文档。
  • Java 命名及目录接口(Java Naming and Directory Interface,JNDI): 用于定义执行目录操作的方法,如使用其属性来搜索对象并将属性和对象关联起来。
  • 基于 XML 的远程过程调用的 Java API(Java API for XML-based Remote Procedure Call,JAX-RPC): 允许开发人员创建由 Web 服务描述语言(Web Service Description Language,WSDL)所描述的客户机及服务。WSDL 将服务描述为一个端点集,这些端点在消息上进行操作并用 XML 进行定义。
  • 基于 XML 的 Web 服务的 Java API(Java API for XML-based Web Services,JAX-WS): 它允许开发人员实现由 WSDL 描述的客户机和服务,在这一点上同 JAX-RPC 类似,但是 JAX-WS 不需要部署描述符,这是由于它使用 @WebService 这样的标注来声明 Web 服务端点。使用 JAX-WS 时,无需使用部署描述符就能部署 Web 服务!
  • XML 绑定的 Java 架构(Java Architecture for XML Binding,JAXB): 提供一个绑定的编译器和一个运行时框架将 Java 对象映射到 XML 文档。此功能确保系统只接受和处理有效的消息。编译器自动将万维网联盟(World Wide Web Consortium,W3C)的 XML 模式转换成 Java 类,使您不必自己编写任何复杂的解析代码。
  • XML 消息的 Java API(Java API for XML Messaging,JAXM): 允许应用程序在互联网上交换 XML 形式的业务文档。这样的例子包括存货清单、发票和数不清的其他业务文档,这些文档的存在使得现代商业得以有效运行。
  • >XML 注册库的 Java API(Java API for XML Registries,JAXR): 为访问不同种类的 XML 注册库提供了一个标准的 API,这在构建、部署以及发现 Web 服务时非常有用。
  • Java 消息服务(Java Message Service,JMS): 允许使用一个统一的 API 来编写基于消息的应用程序,该 API 能对许多消息系统产品的共同特征进行访问。
  • Java 管理扩展(Java Management Extensions,JMX): 这是一个专为监控及管理 J2EE 应用程序服务而创建的 Java 标准。

J2EE 的优势

由于 J2EE 是为企业范围内的应用程序而设计的,该服务器基础设施会自动地为您处理大量的任务。这些任务包括容器管理的事务、可伸缩性、故障转移管理以及安全控制。

容器管理的关系既支持实体 bean(实体 bean 是在持久存储机制中表示业务对象的 Java 类 —— 例如,数据库中特定的一行)之间的一对一关系,也支持它们之间的一对多关系。具有一对多关系的实体 bean 使用 Java 集合来表示 的那一端。管理这样一个关系在概念上同现代关系数据库技术中的关系建模相似。

EJB 容器对于维护所有实体 bean 关系的引用完整性来说是很重要的。在一对一关系中,如果改变了关系的一端,容器会自动替换旧的关系。

对容器管理的事务怎么强调都不会过分。Apache Geronimo 通过提供一个内核来管理 J2EE 标准所指定的容器类以遵循 J2EE 标准。

GBean 架构

Apache Geronimo 设计中主要的容器类是GBean 。事实上,Geronimo 中的几乎任何东西都是一个 GBean。在 Apache Geronimo 的设计中,框架管理 GBean 类的生命周期。当把多个部分部署到一个容器中时,会需要启动或者停止它们。另外,GBean 可以有依赖项。

例如,Bean Y 必须为 Bean X 的运行做好准备,因为 Bean X 必须使用来自 Bean Y 的某些服务才能正常运行。在 Geronimo 的方式中,GBean 将框架必须管理的所有东西打包,特别是前面提到的依赖项。Geronimo 威力的核心和灵魂在于提供了一个框架,在这个框架中,开发人员能使用他们已有的 J2EE 资源。

通过使用 GBean 控件包装现有的 J2EE 资源,能满足 J2EE 标准的生命周期需求。Geronimo 的核心是一个针对 GBean 定义了反转控制(Inversion of Control,IoC)框架的内核。IoC 框架创建了一个环境,在这个环境中,框架能自动管理组件之间的依赖项。

假设 清单 1 是在 Application X(无需担心 Application X 的细节,仅假设它会加载下面的类并调用 doit() 方法)中所使用的 Web 服务。

清单 1. MessageContext
public class WebService { 
  public WebService(MessageContext msgc) {    
    public void doit() {
      ...
    }
  }
}

Application X 拥有称为 MessageContext 的东西,其中包含了所有的配置信息。通过使用这个 WebService 类的 MessageContext,且该类拥有一个像 XX(MessageContext) 一样的构造方法,或者使用诸如 setMessageContext(MessageContext msgctx) 的方法,Application X 就能注入 MessageContext

典型的 J2EE 容器含有两种重要的类:一类是核心服务类,诸如 EJB 容器和 Web 容器,还包括核心服务所部署的应用程序类。有了这个两层的架构,通过该框架提供的自动化过程,对二级类的管理就简化了。

GBean 的行为反映出 Geronimo 架构的本质。通过使用计划(本质上是 GBean 的 XML 串行化),GBean 被加载、启动和处理来管理应用程序类。

部署描述符定义了该框架管理下的应用程序,并且通常打包为 J2EE 应用程序档案文件。Geronimo 部署器通过从中构造 GBean 来解析这些档案文件。部署器构造的 GBean 随后被启动并运行! —— 该应用程序就可用了。随后,GBean 可以被串行化,也可以被存储起来,这样可以在引擎执行其他任务时保持状态。这个行为使得这些部署过的程序即使在重启服务器后仍可使用。

GBean 生命周期

GBean 通常以下列三种状态之一的状态存在:

  • 存储状态: 当其处于存储状态时,GBean 存在于一个计划或配置存储 中。
  • 加载状态: 当被加载时,GBean 被映射到一个非持久的名称,允许同一个 GBean 存在多个实例。
  • 运行状态: GBean 处在运行状态,协调其包含的应用程序类。

在代码中,GBean 生命周期状态的典型实现如 清单 2 所示。

清单 2. GBeanLifecycle 方法
public class AppFunction implements GBeanLifecycle {
  public void doStart() throws Exception {
  }
  public void doStop() throws Exception {
  }
  public void doFail() {
  }
}

GBean 实现了 GBeanLifecycle 接口,允许 Geronimo 框架打开或关闭 GBean,并允许该框架在任何特定的时刻都能够控制状态数据或运行上下文所驻留的位置。

编写 GBean 的通用技巧

这里有一些需要牢记的 GBean 编写技巧:

  • 要想回调生命周期,GBean 必需实现可选的 org.apache.geronimo.gbean.GBeanLifecycle 接口。
  • GETSET 方法能够提供带有属性的 GBean。
  • GBean 的构造方法决不能调用在 GBeanInfo 中声明的成员函数。
  • GBean 必须实现具有下面签名的方法:
    public static GBeanInfo getGBeanInfo()

该框架从这个方法中接收 GBean 使用或暴露的重要元数据。有关操作、引用以及基本属性的元数据在一个静态初始程序块中被初始化,如 清单 3 所示。

清单 3. 元数据
public static final GBeanInfo GBEAN_INFO;

static {
    GBeanInfoBuilder infoBuilder = new GBeanInfoBuilder("AppGbean", AppGbean.class);
    infoBuilder.addAttribute("name", String.class, true);
    infoBuilder.addAttribute("kernel", Kernel.class, false);
    infoBuilder.addOperation("echo", new Class[]{String.class});
    infoBuilder.setConstructor(new String[] {"kernel","Name"});
    GBEAN_INFO = infoBuilder.getBeanInfo();
}

当为属性和引用命名时,必须 遵循标准的 Java 命名惯例:

  • 属性通常以小写字母开头。
  • 引用通常以大写字母开头。

遵循了这些规则会使 GBean 的配置更加简便。

结束语

想要在 Apache Geronimo 环境中有效地编程,必须要理解 GBean —— 它是 Geronimo 满足 J2EE 标准的功能需求的一种方式。Geronimo 1.0 版已经通过了 J2EE 的 Certification Test Suite 的测试,并迅速成为 J2EE 软件技术标准。这是从事几个开放源码项目的众多工程师和来自世界各地的个人贡献者们共同努力的结晶。这确实是一项值得学习的技术。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Open source, Java technology
ArticleID=172176
ArticleTitle=三、二、一 …… Geronimo!,第 1 部分: 让 J2EE 编程更加简单
publish-date=11022006