第一部分:EJB 体系结构的历史和目标 (二)(转)

 
使用 EJB 技术的好处
这些设计目标会使企业和开发人员得到什么好处呢?下面列出了可望从采用 Enterprise JavaBeans 环境获得的好处:
EJB 组件使编写应用程序更为简单。尽管 EJB 体系结构复杂,但应用程序开发人员一般都不必再编写用于访问系统服务的代码。一种称为 EJB 容器的系统组件使系统服务可用于 EJB 组件的任务。
服务器端商务逻辑可以移植。除了 Java 语言固有的可移植性外,EJB 体系结构还在 bean 和支持该 bean 的容器之间提供了一套标准化的应用程序编程接口。这使开发人员能够将 bean 从一种操作环境移植到另一种操作环境,而无须重新编写其源代码。
可以从现有的软件组件装配出服务器端应用程序,这与从现有的 Java bean 可以装配出客户端应用程序一样,从而使软件能够重用。
EJB 体系结构内置了对典型企业级系统服务的支持,包括分布式对象、事务处理、数据库、安全和全局命名。
多家 IT 供应商都采纳 EJB 体系结构,这是由于有这样的承诺:客户将能够从选定的供应商那里选购软件组件,如 EJB 组件、容器及 EJB 服务器;也由于承诺了不同供应商的产品,只要符合 EJB 体系结构,就都是可互操作的。
用 EJB 组件构建的应用程序可以从一个服务器移植到另一个服务器,从而支持可伸缩性,这是因为在 EJB 模型中,各个软件组件都是严格分离的。
EJB 体系结构能保障原有的 IT 投资,这是通过允许将现有的信息系统和资产“包裹”在这些应用程序中,而不要求客户更换现有技术。事实上,在关系数据库中存储数据的企业已经有了一套已有雏形的实体 bean,正等着通过 EJB 外壳去访问。
进一步考察 JNDI
Enterprise JavaBeans 组件使用 Java Naming and Directory Interface (JNDI) 来访问各种目录服务。JNDI 分两部分:应用程序编程接口 (API) 和服务供应商接口 (SPI):
“JNDI 体系结构由 JNDI API 和 JNDI SPI 组成。JNDI API 允许 Java 应用程序访问各种命名和目录服务。JNDI SPI 则是设计来供任意一种服务的供应商(也包括目录服务供应商)使用。这使得各种各样的目录服务和命名服务能够透明地插入到使用 JNDI API 的 Java 应用程序中。(见 JavaSoft,“JNDI: Java Naming and Directory Interface”)


JNDI API 并不同某种专用的命名技术或目录技术连在一起,也不同任何供应商的目录服务连在一起,因此它对 EJB 组件的可移植性有所贡献。例如,客户可以从多种不同的技术中选择,来为其 EJB 应用程序提供目录服务,这些技术包括:
  • LDAP:Sun 的 LDAP 服务供应商支持 LDAP 协议的第 2 版和第 3 版。
  • NIS:Sun 提供一个 NIS 服务供应商(NIS 即网络信息服务,以前称为黄页)。
  • COS 命名:Sun 的 COS 命名服务供应商提供对 CORBA 命名服务的访问。
  • 文件系统:Sun 提供一个服务供应商来访问文件系统。
  • RMI 注册:Sun 为 RMI 注册提供一个服务供应商。
  • Novell:有几个服务供应商可提供对目录服务 NDS 的访问以及 NetWare 3X 连接库、Novell 文件系统和其他 Novell 服务(如扩展 NCP)的访问。

虽然 JNDI 规范对供应商是中立的,但不应认为,实现 JNDI 接口的应用程序服务器一定要能访问来自多个供应商的服务供应商代码。
JNDI 命名体系结构的关键概念包括:
  • 对象和名称之间的绑定。
  • 若干称为命名上下文的绑定集。
  • 命名系统,即若干组命名上下文。
  • 命名空间,指一个命名系统中的所有名称。
  • 名称分类为原子名称、复合名称和合成名称。原子名称是不可分割的,可以绑定到一个对象上。复合名称是原子名称的组合,而合成名称则跨越多个命名系统。


命名上下文特别重要:所有的命名操作均是在上下文对象上进行的,并且名称解析过程总是从最初的命名上下文开始。
EJB 应用程序是如何使用 JNDI 的呢?JNDI 的主要用途是检索对 EJB 组件的引用。因为 EJB 框架是一个分布式对象框架,所以 EJB 应用程序不应当假定 EJB 组件的位置。JNDI 就是获取对 bean 的起始引用的一种机制。当一个 bean 安装到一个 enterprise bean 服务器上时,一个被称为 EJB 容器的软件组件就负责创建各个名称-对象绑定,使所需的 Java 类文件能使用这个 bean。应用程序使用 JNDI 的查找方法来检索对象引用,如下例所示:
Context initialContext = new InitialContext( );CartHome cartHome = javax.rmi.PortableRemoteObject.narrow( initialContext.lookup("applications/shopping_cart"), CartHome.class);

Copyright© 2023 www.sem.org.cn 站长网 版权所有