PC和基于SOAP的接口)
图1:常见的端点类型
要在这些端点上使用Spring的AOP框架,必须把所有的业务逻辑转移到Spring托管的bean中,然后使用服务器托管的组件来委托调用,或者定义事务划分和安全上下文。虽然本文不讨论事务方面的问题,但是可以在“参考资料”部分中找到相关文章。
我将详细介绍如何重构J2EE应用程序以使用Spring功能。我们将使用XDoclet的基于JavaDoc的元数据来生成home和bean接口,以及EJB部署描述符。可以在下面的“下载”部分中找到本文中所有示例类的源代码。
J2EE中使用Spring AOP框架和EJB组件(2)
时间:2011-01-13 BEA Eugene Kuleshov
重构EJB组件以使用Spring的EJB类
想像一个简单的股票报价EJB组件,它返回当前的股票交易价格,并允许设置新的交易价格。这个例子用于说明同时使用Spring Framework与J2EE服务的各个集成方面和最佳实践,而不是要展示如何编写股票管理应用程序。按照我们的要求,TradeManager业务接口应该就是下面这个样子:
public interface TradeManager {
public static String ID = "tradeManager";
public BigDecimal getPrice(String name);
public void setPrice(String name, BigDecimal price);
}
在设计J2EE应用程序的过程中,通常使用远程无状态会话bean作为持久层中的外观和实体bean。下面的TradeManager1Impl说明了无状态会话bean中TradeManager接口的可能实现。注意,它使用了ServiceLocator来为本地的实体bean查找home接口。XDoclet注释用于为EJB描述符声明参数以及定义EJB组件的已公开方法。
/**
* @ejb.bean
* name="org.javatx.spring.aop.TradeManager1"
* type="Stateless"
* view-type="both"
* transaction-type="Container"
*
* @ejb.transaction type="NotSupported"
*
* @ejb.home
* remote-pattern="{0}Home"
* local-pattern="{0}LocalHome"
*
* @ejb.interface
* remote-pattern="{0}"
* local-pattern="{0}Local"
*/
public class TradeManager1Impl implements SessionBean, TradeManager {
private SessionContext ctx;
private TradeLocalHome tradeHome;
/**
* @ejb.interface-method view-type="both"
*/
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);
}
}
/**
* @ejb.interface-method view-type="both"
*/
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);
}
}
public void ejbCreate() throws EJBException {
tradeHome = ServiceLocator.getTradeLocalHome();
}
public void ejbActivate() throws EJBException, RemoteException {
}
public void ejbPassivate() throws EJBException, RemoteException {
}
public void ejbRemove() throws EJBException, RemoteException {
}
public void setSessionContext(SessionContext ctx) throws EJBException,
RemoteException {
t
|