频 道 直 达 - 新闻 - 读书 - 培训 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

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

作者: Eugene Kuleshov 出处:BEA  (  ) 砖  (  ) 好  评论 ( ) 条  进入论坛
更新时间:2006-10-25 18:22
关 键 词:J2EE  Spring  AOP  EJB
阅读提示:本文介绍了一种把J2EE应用程序中的EJB转换为Spring托管组件的方法,以及转换之后可以采用的强大技术。它还给出了几个实际的例子,说明如何借助于Spring的AOP框架、应用面向方面的方法来扩展J2EE应用程序,并在不修改现有代码的情况下实现新的业务需求。

快速发展的开发人员社区、对各种后端技术(包括JMS、JTA、JDO、Hibernate、iBATIS等等)的支持,以及(更为重要的)非侵入性的轻量级IoC容器和内置的AOP运行时,这些因素使得Spring Framework对于J2EE应用程序开发十分具有吸引力。Spring托管的组件(POJO)可以与EJB共存,并允许使用AOP方法来处理企业应用程序中的横切方面——从监控和审计、缓存及应用程序级的安全性开始,直到处理特定于应用程序的业务需求。

本文将向您介绍Spring的AOP框架在J2EE应用程序中的实际应用。

简介

J2EE技术为实现服务器端和中间件应用程序提供了坚实的基础。J2EE容器(比如BEA WebLogic Server)可以管理系统级的元素,包括应用程序生命周期、安全性、事务、远程控制和并发性,而且它可以保证为JDBC、JMS和JTA之类的常见服务提供支持。然而,J2EE的庞大和复杂性使开发和测试变得异常困难。传统的J2EE应用程序通常严重依赖于通过容器的JNDI才可用的服务。这意味着需要大量直接的JNDI查找,或者要使用Service Locator模式,后者稍微有所改进。这种架构提高了组件之间的耦合度,并使得单独测试某个组件成为几乎不可能实现的事情。您可以阅读Spring Framework创建者所撰写的J2EE Development without EJB一书,其中深入分析了这种架构的缺陷。

借助于Spring Framework,可以将使用无格式Java对象实现的业务逻辑与传统的J2EE基础架构连接起来,同时极大地减少了访问J2EE组件和服务所需的代码量。基于这一点,可以把传统的OO设计与正交的AOP组件化结合在一起。本文稍后将会演示如何重构J2EE组件以利用Spring托管的Java对象,然后应用一种AOP方法来实现新特性,从而维护良好的组件独立性和可测试性。

与其他AOP工具相比,Spring提供了AOP功能中的一个有限子集。它的目标是紧密地集成AOP实现与Spring IoC容器,从而帮助解决常见的应用问题。该集成是以非侵入性的方式完成的,它允许在同一个应用程序中混合使用Spring AOP和表现力更强的框架,包括AspectJ。Spring AOP使用无格式Java类,不要求特殊的编译过程、控制类装载器层次结构或更改部署配置,而是使用Proxy模式向应该由Spring IoC容器托管的目标对象应用通知。

可以根据具体情况在两种类型的代理之间进行选择:

◆第一类代理基于Java动态代理,只适用于接口。它是一种标准的Java特性,可提供卓越的性能。
◆第二类代理可用于目标对象没有实现任何接口的场景,而且这类接口不能被引入(例如,对于遗留代码的情况)。它基于使用CGLIB库的运行时字节码生成。

对于所代理的对象,Spring允许使用静态的(方法匹配基于确切名称或正则表达式,或者是注释驱动的)或动态的(匹配是在运行时进行的,包括cflow切入点类型)切入点定义指派特定的通知,而每个切入点可以与一条或多条通知关联在一起。所支持的通知类型有几种:环绕通知(around advice),前通知(before advice),返回后通知(after returning advice),抛出异常后通知(after throwing advice),以及引入通知(introduction advice)。本文稍后将给出环绕通知的一个例子。想要了解更详细的信息,可以参考Spring AOP框架文档。

正如先前提到的那样,只可以通知由Spring IoC容器托管的目标对象。然而,在J2EE应用程序中,组件的生命周期是由应用服务器托管的,而且根据集成类型,可以使用一种常见的端点类型把J2EE应用程序组件公开给远程或本地的客户端:

◆无状态的、有状态的或实体bean,本地的或远程的(基于RMI-IIOP)
◆监听本地或外部JMS队列和主题或入站JCA端点的消息驱动bean(MDB)
◆Servlet(包括Struts或其他终端用户UI框架、XML-RPC和基于SOAP的接口)

图 1.常见的端点类型

图1:常见的端点类型

要在这些端点上使用Spring的AOP框架,必须把所有的业务逻辑转移到Spring托管的bean中,然后使用服务器托管的组件来委托调用,或者定义事务划分和安全上下文。虽然本文不讨论事务方面的问题,但是可以在“参考资料”部分中找到相关文章。

我将详细介绍如何重构J2EE应用程序以使用Spring功能。我们将使用XDoclet的基于JavaDoc的元数据来生成home和bean接口,以及EJB部署描述符。可以在下面的“下载”部分中找到本文中所有示例类的源代码。

重构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 {
this.ctx = ctx;
}   
}


共6页: 1 [2] [3] [4] [5] [6] 下一页
【内容导航】
发表
查看
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·Java基础教程 (查看52371次)
·UML类图详解 (查看46839次)
·Java编程开发手册 (查看25118次)
·UML统一建模语言 (查看24099次)
·C#技术开发指南 (查看22406次)
·Java编程开发手册 (1195个砖)
·Java基础教程 (429个砖)
·C#技术开发指南 (304个砖)
·PB开发教程 (220个砖)
·.NET开发手册 (217个砖)
·Java编程开发手册 (653个好)
·Java基础教程 (569个好)
·.NET开发手册 (251个好)
·PB开发教程 (209个好)
·Delphi开发技术手册 (174个好)
订阅技术快讯
电子杂志下载
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
名称:Vista精品应用黄皮书
简介:《Vista精品应用黄皮书》囊括了Vista的各方面内容。此次的精简版,是将里面的内容做了提取,便于用户下载和使用。内容包含了各种Vista的安装与实施、技巧与解析以及各种Vista相关学习文档和相关软件的安全下载。该电子书是了解和应用Vista人员必备的工具手册,并且也是第一本
名称:2006中国IT论坛精品集合
简介:本书由“51CTO论坛推广联盟”制作完成。书中所有内容均来自各联盟成员的论坛(网站)。制作本书的目的是为了集中大家的优势资源,将更多更精彩的内容带给广大技术爱好者。本书是联盟成立以来制作的第一本书。
关键字阅读
频道精选
主编信箱 热线:010-66476606 告诉我们您想看的:专题 文章
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 意见反馈 | 网站地图
Copyright©2005-2007 51CTO.COM 版权所有