J2EE中使用Spring AOP框架和EJB组件(2)

J2EE中使用Spring AOP框架和EJB组件(2)

[@more@]

如果要在进行代码更改之后测试这样一个组件,那么在运行任何测试(通常是基于专用的容器内测试框架,比如Cactus或MockEJB)之前,必须要经过构建、启动容器和部署应用程序这整个周期。虽然在简单的用例中类的热部署可以节省重新部署的时间,但是当类模式变动(例如,添加域或方法,或者修改方法名)之后它就不行了。这个问题本身就是把所有逻辑转移到无格式Java对象中的最好理由。正如您在TradeManager1Impl代码中所看到的那样,大量的粘和代码把EJB中的所有内容组合在一起,而且您无法从围绕JNDI访问和异常处理的复制工作中抽身。然而,Spring提供抽象的便利类,可以使用定制的EJB bean对它进行扩展,而无需直接实现J2EE接口。这些抽象的超类允许移除定制bean中的大多数粘和代码,而且提供用于获取Spring应用程序上下文的实例的方法。

首先,需要把TradeManager1Impl中的所有逻辑都转移到新的无格式Java类中,这个新的类还实现了一个TradeManager接口。我们将把实体bean作为一种持久性机制,这不仅因为它超出了本文的讨论范围,还因为WebLogic Server提供了大量用于调优CMP bean性能的选项。在特定的用例中,这些bean可以提供非常好的性能。我们还将使用Spring IoC容器把TradeImpl实体bean的home接口注入到TradeDao的构造函数中,您将从下面的代码中看到这一点:

public class TradeDao implements TradeManager {

private TradeLocalHome tradeHome;

public TradeDao(TradeLocalHome tradeHome) {

this.tradeHome = tradeHome;

}

public BigDecimal getPrice(String symbol) {

try {

return tradeHome.findByPrimaryKey(symbol).getPrice();

} catch(ObjectNotFoundException ex) {

return null;

} catch(FinderException ex) {

throw new EJBException("Unable to find symbol", ex);

}

}

public void setPrice(String symbol, BigDecimal price) {

try {

try {

tradeHome.findByPrimaryKey(symbol).setPrice(price);

} catch(ObjectNotFoundException ex) {

tradeHome.create(symbol, price);

}

} catch(CreateException ex) {

throw new EJBException("Unable to create symbol", ex);

} catch(FinderException ex) {

throw new EJBException("Unable to find symbol", ex);

}

}

}

现在,可以使用Spring的AbstractStatelessSessionBean抽象类重写TradeManager1Impl,该抽象类还可以帮助您获得上面所创建的TradeDao bean的一个Spring托管的实例:

/**

* @ejb.home

* remote-pattern="TradeManager2Home"

* local-pattern="TradeManager2LocalHome"

* extends="javax.ejb.EJBHome"

* local-extends="javax.ejb.EJBLocalHome"

*

* @ejb.transaction type="NotSupported"

*

* @ejb.interface

* remote-pattern="TradeManager2"

* local-pattern="TradeManager2Local"

* extends="javax.ejb.SessionBean"

* local-extends="javax.ejb.SessionBean, org.javatx.spring.aop.TradeManager"

*

* @ejb.env-entry

* name="BeanFactoryPath"

* value="applicationContext.xml"

*/

public class TradeManager2Impl extends AbstractStatelessSessionBean implements

TradeManager {

private TradeManager tradeManager;

public void setSessionContext(SessionContext sessionContext) {

super.setSessionContext(sessionContext);

// make sure there will be the only one Spring bean config

setBeanFactoryLocator(ContextSingletonBeanFactoryLocator.getInstance());

}



public void onEjbCreate() throws CreateException {

tradeManager = (TradeManager) getBeanFactory().getBean(TradeManager.ID);

}



/**

* @ejb.interface-method view-type="both"

*/

public BigDecimal getPrice(String symbol) {

return tradeManager.getPrice(symbol);

}

/**

* @ejb.interface-method view-type="both"

*/

public void setPrice(String symbol, BigDecimal price) {

tradeManager.setPrice(symbol, price);

}

}

现在,EJB把所有调用都委托给在onEjbCreate()方法中从Spring获得的TradeManager实例,这个方法是在AbstractEnterpriseBean中实现的,它处理所有查找和创建Spring应用程序上下文所需的工作。但是,必须在EJB部署描述符中为EJB声明BeanFactoryPath env-entry,以便将配置文件和bean声明的位置告诉Spring。上面的例子使用了XDoclet注释来生成这些信息。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7839366/viewspace-919842/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7839366/viewspace-919842/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值