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

  EJB(EnterpriseJavaBeans)是使用JavaEE开发和部署业务应用系统的服务端组件架构,使用EJB编写的应用系统是可扩展的、事务型和安全的。EJB3.0是JavaEE5平台的一部分,相对前面的版本,它更加易于使用,它的最新版本—JSR318:EJB3.1—随JavaEE6发布,进一步简化了使用,并提供了许多反应常见使用模式的改进,如:

 

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

 

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

 

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

 

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

 

  5、轻量级EJB:它是EJB3.1的子集,包括大量的JavaEEprofiles。

 

无接口视图

 

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

 

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

 

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

!--

 

  Code highlighting produced byActiproCodeHighlighter(freeware)

  http://www.CodeHighlighter.com/

  -->@Stateless

  public class HelloBean {

  publicString sayHello() {

  String message =propertiesBean.getProperty(hello.message);

  return message;

  }

  }

 

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

!--

 

  Code highlighting produced byActiproCodeHighlighter(freeware)

  http://www.CodeHighlighter.com/

  -->@EJB

  private HelloBean helloBean;

  ...

  String msg =helloBean.sayHello();

 

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

 

单元素集合

 

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

 

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

!--

 

  Code highlighting produced byActiproCodeHighlighter(freeware)

  http://www.CodeHighlighter.com/

  -->@Singleton

  public class PropertiesBean{

  private Properties props;

  public StringgetProperty(String name) { ...}

  @PostConstruct

  publicvoid initialize {

  // props = ...

  }

}

 

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

!--

 

  Code highlighting produced byActiproCodeHighlighter(freeware)

  http://www.CodeHighlighter.com/

  -->@EJB

  private PropertiesBean propsBean;

  ...

  String msg=propsBean.getProperty(hello.message);

 

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

 

异步会话Bean调用

 

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

 

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

 

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

 

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

!--

 

  Code highlighting produced byActiproCodeHighlighter(freeware)

  http://www.CodeHighlighter.com/

  -->@Stateless

  Public class CalculatorBeanimplementsCalculatorService {

  ...

  @Asynchronous

  publicFutureperformCalculation(...) {

  //... docalculation Integerresult = ...;

  returnnew AsyncResult(result);

  }

  }

 

简化打包

 

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

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

 

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

 

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

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

 

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

 

轻量级EJB(EJB Lite)

 

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

 

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

 

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

 

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

 

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

 

  3、拦截器;

 

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

 

  5、声明和编程安全;

 

  6、嵌入式API。

 

更多EJB3.1新特性

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值