EJB 3.1五大模式改进令Java EE 6更好用

原创
开发 后端
EJB 3.1是Java EE 6当中加入的最重要的部分。EJB(Enterprise JavaBeans)是使用Java EE开发和部署业务应用系统的服务端组件架构,使用EJB编写的应用系统是可扩展的、事务型和安全的。本文对EJB 3.1的五大使用模式的改进进行了详细介绍。

【51CTO精选译文】EJB(Enterprise JavaBeans)是使用Java EE开发和部署业务应用系统的服务端组件架构,使用EJB编写的应用系统是可扩展的、事务型和安全的。EJB 3.0是Java EE 5平台的一部分,相对前面的版本,它更加易于使用,它的***版本 — JSR318:EJB 3.1 — 随Java EE 6发布,进一步简化了使用,并提供了许多反应常见使用模式的改进,如:

1、无接口视图:允许你指定一个企业Bean,只使用Bean类,不用编写独立的业务接口。

2、单元素集合:让你在一个企业Bean组件的多个实例间轻松地共享状态,或是在一个应用程序的多个企业Bean组件之间共享状态。

3、异步会话Bean调用:通过指定一个注解,让你可以异步调用会话状态方法。

4、简化打包:消除了企业Bean类必须打包到ejb-jar文件的限制,现在你可以直接将EJB类放到WAR文件中。

5、轻量级EJB:它是EJB 3.1的子集,包括大量的Java EE profiles。

无接口视图

#t#EJB 3.0本地客户端视图是基于普通旧式Java接口(POJI)调用本地业务接口的,本地接口定义了暴露给客户端的业务方法,并是在Bean类上实现的,这种独立的接口有时会带来不必要的麻烦,并且价值也不大,相同模块内的来自客户端的本地访问细粒度组件尤其如此。

EJB 3.1通过让本地业务接口成为可选组件简化了这个方法,没有本地业务接口的Bean暴露的是无接口视图,现在你不用编写独立的业务接口就可以获得相同的企业Bean功能。

无接口视图与EJB 3.0中的本地视图具有相同的行为,例如,它支持如通过按引用调用语义、事务和安全传播等特性,但无接口视图不需要单独的接口,即Bean类所有的公共方法自动暴露给调用者。默认情况下,任何有空implements子句,且没有定义任何其它本地或远程客户端视图的会话Bean,暴露的是一个无接口视图。下面的会话Bean暴露了一个无接口视图:

  1. @Stateless 
  2.    public class HelloBean {  
  3.  
  4.        public String sayHello() {  
  5.            String message = propertiesBean.getProperty("hello.message");  
  6.            return message;  
  7.        }  
  8.  
  9.    }  
  10.  

使用本地视图时,无接口视图的客户端总是获得一个EJB引用 — 通过注入或JNDI查找,唯一的不同之处是EJB引用的Java类型是Bean类类型,而不是本地接口的类型,如下面的Bean客户端:

  1. @EJB 
  2.  private HelloBean helloBean;  
  3.  
  4.  ...  
  5.  
  6.  String msg = helloBean.sayHello();  

注意,虽然这里没有接口,客户端不能使用new()明确地实例化Bean类,那是因为所有Bean调用都是通过一个特殊的EJB引用,或由容器提供的代理实现的,这样就允许容器提供其它的Bean服务,如池、容器管理的事务,并发管理等。

#p#

单元素集合

单元素集合Bean也被称为单元素集合,它是一种新的会话Bean,它保证在一个特定的Java虚拟机(JVM)应用程序中只被实例化一次。使用单元素集合,你可以在一个企业Bean组件的多个实例之间轻松地共享状态,也可以在一个应用程序的多个企业Bean之间共享状态,它就象为某个应用程序缓存数据的类一样。你可以以单元素集合形式定义类,这样可以确保在应用程序内只有一个缓存实例,一个共享状态。

使用@Singleton注解定义单元素集合,如:

  1. @Singleton 
  2.    public class PropertiesBean {  
  3.  
  4.     private Properties props;  
  5.  
  6.     public String getProperty(String name) { ... }  
  7.  
  8.    @PostConstruct 
  9.           public void initialize { // props = ...}  
  10.  
  11.    }  
  12.  

因为它只是另一种会话Bean,单元素集合可以定义相同的本地和远程客户端视图,可以象无状态的和有状态的Bean那样,客户端以访问无状态和有状态Bean相同的方式访问单元素集合,即通过EJB引用。例如,下面是一个可以访问PropertiesBean单元素集合的客户端示例:

  1. @EJB 
  2.    private PropertiesBean propsBean;  
  3.  
  4.    ...  
  5.  
  6.    String msg = propsBean.getProperty("hello.message");  
  7.  

在这里,容器确保所有通过PropertiesBean引用的调用是由相同的PropertiesBean实例提供的服务,默认情况下,容器强制执行和其它组件类型相同的线程保证,换句话说,单元素集合是全线程安全的,特别值得一提的是,在任一时刻,允许多个调用访问一个特定的Bean实例,默认情况下,单元素集合会阻塞所有并发调用,但还有其它并发选项允许更高效地访问单元素集合实例。

#p#

异步会话Bean调用

#t#EJB 3.1引入了一个强大功能,那就是可以异步调用会话Bean方法。对于一个异步调用,允许会话Bean执行它的操作时,客户端并行处理其它事情。

通过@Asynchronous注解让一个方法支持异步,也可以使用一个部署描述符将一个方法指定为异步的。

异步方法可以返回一个java.util.concurrent.Future<V>或void对象,Future<V>对象容纳了异步操作返回的结果,你可以访问Future<V>对象检索一个结果值,检查异常或取消一个正在处理中的调用。Future<V>接口提供一个get()方法检索值,当然,你也可以其它合适的类检索值,如AsyncResult<V>,实际上它自己实现了一个Future<V>接口。

在下面的例子中,performCalculation()方法是异步的,它使用AsyncResult<V>类检索Future<V>对象返回的值。

  1. @Stateless 
  2.    Public class CalculatorBean implements CalculatorService {  
  3.       ...  
  4.  
  5.       @Asynchronous 
  6.       public Future<Integer> performCalculation(...) {  
  7.  
  8.          // ... do calculation  
  9.  
  10.          Integer result = ...;  
  11.          return new AsyncResult<Integer>(result);  
  12.       }  
  13.    }  
  14.  

#p#

简化打包

EJB规范始终要求企业Bean打包到一个叫做ejb-jar文件的企业模块中,因为它一般用于Java EE Web应用程序,这种打包方法显得有些累赘,应用程序被强制使用一个Web应用程序使用的归档文件(.war),一个企业Bean使用的ejb-jar文件,还有一个包含其它包的企业归档文件(.ear),如图1所示,这种打包方法非常复杂,它需要指定模块之间共享的类和资源。

传统的企业应用程序打包方法 
图 1 传统的企业应用程序打包方法

EJB 3.1解决了这个问题,简化了打包的复杂程度,彻底消除了企业Bean类必须打包进ejb-jar文件的限制,如图2所示,现在你可以直接将EJB类放到.war文件中,使用打包Web应用程序类相同的打包规则,这意味着你可以将EJB类放到WEB-INF/classes目录下,或者放到WEB-INF/lib目录下的一个.jar文件中。EJB部署描述符也是可选的,如果你需要它,你可以将EJB部署描述符打包到WEB-INF/ejb-jar.xml文件中。

简化的企业应用程序打包方法 
图 2 简化的企业应用程序打包方法

#p#

轻量级EJB(EJB Lite)

对许多应用程序而言,EJB提供了比应用程序真正需要的多得多的功能,使用EJB的应用程序通常只需要使用EJB 3.1的一个子集,轻量级EJB就是为满足这种需要诞生的。

轻量级EJB简化了许多开发人员使用EJB,使用轻量级EJB的开发人员在他们的应用程序中需要学习使用一部分功能即可。此外,使用轻量级EJB开发的应用程序可以运行在轻量级EJB或全功能EJB 3.1 API实现的应用程序服务器上。

注意,轻量级EJB不是一个产品,它是EJB 3.1 API的一个子集,轻量级EJB的目标是提供EJB 3.1的一个子集,满足大多数应用程序业务逻辑层的需要,它也为供应商提供了更好的灵活性,为了满足这些模板,轻量级EJB提供了以下功能:

1、有状态,无状态和单元素集合会话Bean;

2、本地EJB接口或无接口;

3、拦截器;

4、容器管理的和Bean管理的事务;

5、声明和编程安全;

6、嵌入式API。

更多EJB 3.1新特性

#t#EJB 3.1除前面谈到的这些新特性外,还带来了更多的新特性和改进,例如,它包括一个用于Java SE环境的嵌入式API和容器,这些特性使在Java EE容器外(通常指Java SE环境)测试EJB组件更容易,另外,EJB 3.1引入的单元素集合为EJB应用程序提供了一个方便的方法,在应用程序初始化或关闭期间接受反馈,默认情况下,由容器决定何时实例化单元素集合实例,但你可以通过@Startup注解,强制容器在应用程序初始化期间实例化单元素集合实例,允许Bean定义一个@PostConstruct方法保证在应用程序启动时调用,此外,@PreDestroy方法可以保证应用程序关闭时调用。

【51CTO.com译稿,非经授权请勿转载。合作站点转载请注明原文译者和出处为51CTO.com,且不得修改原文内容。】

原文:EJB Technology, Even Easier to Use  作者:Ed Ort

责任编辑:yangsai 来源: 51CTO.com
相关推荐

2010-01-25 17:07:57

万兆交换机EJB 3.1

2009-07-23 09:42:44

EJB 3.1Java EE 6

2012-09-11 10:31:21

OpenSuse

2010-07-01 15:31:08

Java EE 6EJBWebService

2011-06-20 14:04:14

Mac OS X

2011-08-15 09:33:16

Ubuntu 11.1

2019-09-29 09:00:00

PostgreSQLGUI工具数据库

2009-10-14 11:19:11

桌面虚拟化模式

2020-06-22 07:00:00

软件架构架构模式

2010-07-15 14:37:20

Ubuntu 10.1

2010-06-12 08:53:17

Visual Stud

2011-09-07 09:21:01

设计模式

2012-05-16 10:51:36

Windows Ser组策略

2013-02-27 10:30:40

2022-08-05 14:46:28

区块链Web 3.0NFT

2019-06-04 10:40:07

2012-06-13 01:37:40

JSPJava

2018-04-26 10:57:44

PHP运行模式

2013-04-27 09:03:31

Hyper-V虚拟交换机改进

2019-05-23 20:58:05

安卓Akamai
点赞
收藏

51CTO技术栈公众号