EJB3.0层次结构
大多数传统企业应用程序都至少有四层:
1) 表现层是实际的用户界面,可以是浏览器或桌面应用程序;
2) 业务逻辑层定义业务规则;
3) 持久化层和数据库进行交互;
4) 数据库层由存储持久化对象的关系数据库(比如Oracle)构成。
如3.1-1图所示。
图3.1-1
很显然EJB不是表现层技术,完全是实现业务逻辑和持久化层的健壮支持,图3.1-2显示了EJB如何通过其服务支持这些技术。
图3.1-2
EJB3提供的各个组件服务支持应用层。注意各个服务之间是相互独立的,所以你可以在最大程度上自由地选择对应用程序来说非常重要的特性。
1.2 容器结构
1.2.1 基础点
1.2.1.1 EJB容器介绍
EJB组件运行在EJB容器之中,EJB容器是一个EJB引擎,它提供了EJB组件运行的环境,并对EJB组件进行管理。EJB容器一般包含在EJB服务器(或应用服务器)中,EJB服务器可以拥有一到多个EJB容器。
要理解容器的架构,需要明白三点:代理存根(proxy stub)、容器以及bean实例本身。当调用bean的远程或本地接口时,你所使用的对象实例是一种被称为代理存根的东西。该代理存根实现session bean的远程或本地接口,并且负责将你的session bean调用经过网络发送到远程EJB容器,或将请求路由到位于本地的JVM内的EJB容器。EJB容器的职责是管理bean class实例及其安全和事务,容器会根据元数据或部署描述文件来启动事务并执行验证和授权任务,容器还负责管理bean的生命周期,并将来自代理的请求路由到真正的bean class实例。
存根、容器及bean实例关系图
EJB服务器支持6种基本服务:并发、事务管理、持久化、对象分布、命名和安全。这些基本服务为成功开发多层系统提供了必须的基础架构。EJB还提供了两个额外的服务:异步消息服务和定时服务。下图描述了EJB服务器结构
EJB服务器结构
1.2.1.2 EJB容器规约
我们常把EJB服务器中围绕bean的周边环境称之为容器。它是一个概念,而非物理构件。它充当bean和EJB服务器之间的中介,管理EJB对角并帮助服务器构件管理bean资源,提供诸如事务,安全,并发和运行期命名之类的服务。容器与服务器并没有明确的界定。
接口javax.ejb.EJBContext是一个由容器实现的接口,是bean容器规范的组成部分。Session bean使用一个叫做javax.ejb.SessionContext的子类。Message-driven bean则使用javax.ejb.MessageDrivenContext子类。这些EJBContext类型为bean提供了其所在环境的相关信息,内容涉及:容器,使用enterprise bean的客户端,以及bean本身(相当于this指针,但EJB规范不允许在enterprise bean中使用this指针)。Bean可以在处理来自客户端的请求和来自容器的回调方法时使用这些信息。
Enterprise bean的接口中还包含了JNDI名字空间,我们称其为环境命名上下文(ENC),bean可以用它来查找所需的资源。
1.3 组件模型
1.3.1 基础点
EJB3组件模型中包含三种Enterprise Java Bean,分别是:Session Bean,Message Driven Bean和Entity Bean。
EJB3的架构非常灵活,提供了如下能力:
² 一个对象表述一个无状态的服务
² 一个对象表述一个无状态服务,且实现一个web service端点
² 一个对象表述一个无状态的服务,且它的调用由异步的消息来驱动
² 一个对象与一个特定的客户端表述一个会话。这样的会话对象会自动的保持会话状态,且不受多重客户端调用方法的影响
² 一个实体对象表述一个细粒度的持久化对象
EJB3规范通过大量使用annotation,大大简化了配置的难度;仅仅通过为普通的Session Bean方法加上简单的annotation(@WebService)即可使该方法作为一个Web Service了。
1.3.1.1 接口类型
【远程接口】
定义了session bean的业务方法,这些方法可以被来自EJB容器以外的应用访问到:也就是Bean提供给外界完成其工作的业务方法。
◆【本地接口】
定义了session bean的业务方法,这些方法可以被处于同一EJB容器内的其他bean所使用:也就是bean提供给运行于同一JVM中的其他bean的业务方法。
◆【端点接口】
定义了可以被EJB容器以外的应用系统经由SOAP协议进行访问的业务方法。
◆【消息接口】
Message-driven Bean实现了该接口,该接口定义了一系列方法,像JMS这样的消息系统可以藉此来向bean发送消息。
Session Bean关注实现业务逻辑;在容器的支持下,Session Bean具有以下几个重要特征:
1、支持并发和线程安全
2、可支持远程处理和web service
3、支持事务与安全管理
4、支持计时器服务器和拦截器
Session Bean可以分为两类:无状态Session Bean和有状态Session Bean。
叙述MDB之前,先简单介绍J2EE中包含两种消息模型,点对点模型与发布-订阅模型。
请参看异步企业消息服务的详细说明。我们遇到的大部分MDB都是实现的JMS接口。
MDB(Message Driven Bean)同样实现业务逻辑;与Session Bean 不同的是,客户端不直接调用MDB的方法。客户端通过发送到消息服务器的消息来触发MDB的执行,实现了系统组件间的异步操作。MDB通常用于健壮系统的集成或异步处理。
² MDB可以自行处理多线程,实现并发而不需要附加任何无业无关代码
² MDB减少了使用消息机制的配置及编码量;也可以通过部署描述文件或注解来提供配置信息
|
MDB池 |
容器收到消息 |
客户端 |
目的地 |
MDB |
消息到达目的地 |
Order对象 |
使用@MessageDriven注解可以很容易的创建MDB,具体使用及示例这里暂不叙述。
JBoss服务器中使用的是JBoss MQ。
EJB3的持久化由JPA管理,它使用成为对象-关系映射(ORM)的技术自动持久化Java对象。
JPA定义了持久化的规范,定义了如下标准:
² 用于把实体映射到数据库表的ORM配置元数据的创建
² EntityManager API,用于对实体执行CRUD(创建、读取、更新和删除)
² Java持久化查询语言(JPQL)
目前比较常见的实现有JBoss Hibernate、Oracle TopLink和Apache OpenJPA。需要提到的是,JPA中并没有对缓存的处理加以规范,在选择JPA实现时,需要加以注意。