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

[@more@]本文介绍了一种把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的接口)

498)this.style.width=498;" />

图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;

}

}

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

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

J2EE中使用Spring AOP框架和EJB组件(1)相关推荐

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

    J2EE中使用Spring AOP框架和EJB组件(6) [@more@] 组合和链接通知 我们已经使用了一个简单的拦截器通知来实现附加的逻辑,并且将其当作一个独立的组件进行了测试.当应该在不进行修改 ...

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

    快速发展的开发人员社区.对各种后端技术(包括JMS.JTA.JDO.Hibernate.iBATIS等等)的支持,以及(更为重要的)非侵入性的轻量级IoC容器和内置的AOP运行时,这些因素使得Spri ...

  3. [转载]使用SPRING AOP框架和EJB组件

    使用SPRING AOP框架和EJB组件 摘要 快速发展的开发人员社区.对各种后端技术(包括JMS.JTA.JDO. Hibernate.iBATIS等等)的支持,以及(更为重要的)非侵入性的轻量级I ...

  4. spring aop组件_安全性中的Spring AOP –通过方面控制UI组件的创建

    spring aop组件 以下文章将显示在我参与的一个项目中,我们如何使用Spring的AOP来介绍一些与安全性相关的功能. 这样的概念是,为了使用户能够看到某些UI组件,他需要具有一定级别的安全特权 ...

  5. 安全性中的Spring AOP –通过方面控制UI组件的创建

    以下文章将显示在我参与的一个项目中,我们如何使用Spring的AOP来介绍一些与安全性相关的功能. 这样的概念是为了使用户能够看到一些UI组件,他需要具有一定级别的安全特权. 如果不满足该要求,则不会 ...

  6. 在 Spring Boot 中使用 Spring AOP 和 AspectJ 来测量方法的执行时间

    原文链接:https://dzone.com/articles/logging-average-method-execution-times-via-aspectj 作者:Murat Derman 译 ...

  7. 在Eclipse RCP中使用Spring AOP/ProxyFactory的问题

    也许你还没有在RCP中用过SPRING,也许你用过,但没有遇到什么问题,那是因为你只用了简单的IOC,而没有用到AOP或是FactoryBean,因此,您并没有碰到什么问题,但一些很简单的需求导致我们 ...

  8. SpringBoot 框架中 使用Spring Aop 、创建注解、创建枚举类 使用过程记录

    1.开始 在Springboot框架中引入AOP <dependency><groupId>org.springframework.boot</groupId>&l ...

  9. 在Spring Boot 项目中使用Spring AOP实现切面日志

    导语   大数据时代,数据来源是比较重要的.而日志作为用户操作.系统监控.业务分析等都比较重要的一个环节.能更好的使用日志显得尤为重要.那么在Spring Boot的项目中如何能更加高效的记录Cont ...

最新文章

  1. 华硕服务器如何安装系统安装win7系统,华硕电脑怎么重新安装win7系统
  2. Qcom LK阶段如何使用ADC介绍
  3. 哇,union的优先级很高嘛
  4. 【Python3_基础系列_012】Python3-异常与断言
  5. GFM与博客园markdown测试
  6. Java JDBC工具类
  7. 精选JAVA毕业设计83套——源码+论文完整资源
  8. java 生成随机数 (Random函数)
  9. js微信抢红包脚本代码_autojs抖音抢红包脚本!源码分享
  10. PAT(甲级)2021年冬季考试 7-2 Rank a Linked List
  11. 顺序匹配网络:基于检索的聊天机器人中多回合响应选择的新架构
  12. ubuntu安装使用redis并设置开机启动
  13. 最新注册谷歌账号详细步骤,解决“此电话号码无法验证”问题
  14. 计算机科学报数学竞赛,五大学科竞赛参加哪一个科目?五大学科竞赛赛程设置分析!...
  15. Centos升级安装Openssh9.0p1
  16. matlab怎么读txt文件字符串,Matlab中读取txt文件的几种方法
  17. 硕士毕业论文参考文献整理、插入以及各种相关心得(限武汉大学EndNote软件)
  18. 跨时钟域信号处理---脉冲同步器详解
  19. 谈谈本科生和研究生的差距
  20. word同类标题另起一页

热门文章

  1. 第四篇,STM32中断控制编程
  2. ahk写的脚本win11需要以管理员运行才能生效,有什么办法能默认用管理员身份运行吗
  3. vue解决两个字和三个字对齐问题
  4. 忠诚和勤奋是你成就事业的唯一机会
  5. 海沧e政务终端服务器都在哪里,厦门e政务便民服务站延伸到海沧区和集美区了...
  6. 目标跟踪之相关滤波:CF及后续改进篇
  7. Python程序退出时执行指定代码
  8. 家庭自建流媒体服务器,如何创建自己的“家庭媒体流服务器”使用Plex与FreeNAS - 第3部分...
  9. 般若波罗蜜多心经白话译文
  10. BI报表之电网大屏显示制作