技术开发 频道

详解EJB 3会话 Bean

业务方法

   有状态会话Bean中的业务方法也与无状态会话Bean中的类似;在我们的ShoppingCart例子中,下面这些业务方法会从“购物车”中添加或去除酒类,并返回一个“购物车”中的物品清单。

   例13是实现了addWineItem()、removeWineItem()、getCartItems()的ShoppingCart。

例13:ShoppingCartBean.java package com.apress.ejb3.chapter02; import java.util.ArrayList; import javax.ejb.Stateful; @Stateful(name="ShoppingCart") public class ShoppingCartBean implements ShoppingCart, ShoppingCartLocal { public ShoppingCartBean() { } public ArrayList cartItems; public void addWineItem(String wine) { cartItems.add(wine); } public void removeWineItem(String wine) { cartItems.remove(wine); } public void setCartItems(ArrayList cartItems) { this.cartItems = cartItems; } public ArrayList getCartItems() { return cartItems; } }

回调方法

   有状态会话Bean支持构造、析构、激活、钝化的回调事件,以下是各自对应的项目:

 PostConstruct:以@PostConstruct注释符表示。Bean类中的任意方法都可标以此注释符。
 PreDestroy:以@PreDestroy注释符表示。
 ProActivate:以@PreActivate注释符表示。
 PrePassivate:以@PrePassivate注释符表示。

   PostContruct回调函数发生在一个Bean实例在EJB容器中初始化之后,如果Bean在此环境中使用了依赖性注入机制来获取资源或其他对象的引用,则PostConstruct事件发生在注入执行之后,及Bean类中第一个业务方法调用之前。

   在ShoppingCart会话Bean的例子中,可有一个名为initialize()的业务方法来初始化商品清单,如例14:

例14:PostConstruct方法 @PostConstruct public void initialize() { cartItems = new ArrayList(); }

   PreDestroy回调函数发生在任意带有@Remove注释符的方法执行完毕之后。在ShoppingCart会话Bean例子中,可有一个名为exit()的业务方法把商品清单写入数据库。在本文中,只是在命令行窗口中输出一条信息表示回调,例15为exit()方法的代码,其带有@PreDestroy。

例15:PreDestroy方法 @PreDestroy public void exit() { //此处模拟将商品清单写入数据库 System.out.println("已将清单信息保存入数据库。"); }

   对有状态会话Bean来说,@Remove注释符是一个非常有用的生命周期方法,当带有@Remove注释符的方法被调用时,容器会在方法执行之后,从对象池中移除Bean实例。例16是stopSession()代码,其标以@Remove。

例16:Remove方法 @Remove public void stopSession() { //在此,方法体可为空白。 System.out.println("此消息出自带有@Remove注释的stopSession方法。"); }

   PrePassivate回调函数发生在一个有状态会话Bean实例空闲太久时,在这个事件中,容器可能“钝化”并把它的状态存储在缓存中。标以@PrePassivate的方法会在容器钝化Bean实例之前被调用。

   而PostActivate事件会在客户程序再次使用一个钝化的有状态会话Bean时发生,此时会创建一个带有之前存储状态的新实例。标以@PostActivate的方法在当Bean实例准备好时被调用。

拦截器方法

   无状态与有状态会话Bean的拦截器方法,也存在稍许差异,比如说,可在有状态会话Bean中使用AroundInvoke方法,对有状态会话Bean来说,其实现了SessionSynchronization(会话同步),而afterBegin则执行在任意AroundInvoke方法调用之前,且也在beforeCompletion()回调函数调用之前。

0
相关文章