J2EE中使用Spring AOP框架和EJB组件(1)
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)相关推荐
- J2EE中使用Spring AOP框架和EJB组件(6)
J2EE中使用Spring AOP框架和EJB组件(6) [@more@] 组合和链接通知 我们已经使用了一个简单的拦截器通知来实现附加的逻辑,并且将其当作一个独立的组件进行了测试.当应该在不进行修改 ...
- J2EE中使用Spring AOP框架和EJB组件
快速发展的开发人员社区.对各种后端技术(包括JMS.JTA.JDO.Hibernate.iBATIS等等)的支持,以及(更为重要的)非侵入性的轻量级IoC容器和内置的AOP运行时,这些因素使得Spri ...
- [转载]使用SPRING AOP框架和EJB组件
使用SPRING AOP框架和EJB组件 摘要 快速发展的开发人员社区.对各种后端技术(包括JMS.JTA.JDO. Hibernate.iBATIS等等)的支持,以及(更为重要的)非侵入性的轻量级I ...
- spring aop组件_安全性中的Spring AOP –通过方面控制UI组件的创建
spring aop组件 以下文章将显示在我参与的一个项目中,我们如何使用Spring的AOP来介绍一些与安全性相关的功能. 这样的概念是,为了使用户能够看到某些UI组件,他需要具有一定级别的安全特权 ...
- 安全性中的Spring AOP –通过方面控制UI组件的创建
以下文章将显示在我参与的一个项目中,我们如何使用Spring的AOP来介绍一些与安全性相关的功能. 这样的概念是为了使用户能够看到一些UI组件,他需要具有一定级别的安全特权. 如果不满足该要求,则不会 ...
- 在 Spring Boot 中使用 Spring AOP 和 AspectJ 来测量方法的执行时间
原文链接:https://dzone.com/articles/logging-average-method-execution-times-via-aspectj 作者:Murat Derman 译 ...
- 在Eclipse RCP中使用Spring AOP/ProxyFactory的问题
也许你还没有在RCP中用过SPRING,也许你用过,但没有遇到什么问题,那是因为你只用了简单的IOC,而没有用到AOP或是FactoryBean,因此,您并没有碰到什么问题,但一些很简单的需求导致我们 ...
- SpringBoot 框架中 使用Spring Aop 、创建注解、创建枚举类 使用过程记录
1.开始 在Springboot框架中引入AOP <dependency><groupId>org.springframework.boot</groupId>&l ...
- 在Spring Boot 项目中使用Spring AOP实现切面日志
导语 大数据时代,数据来源是比较重要的.而日志作为用户操作.系统监控.业务分析等都比较重要的一个环节.能更好的使用日志显得尤为重要.那么在Spring Boot的项目中如何能更加高效的记录Cont ...
最新文章
- 华硕服务器如何安装系统安装win7系统,华硕电脑怎么重新安装win7系统
- Qcom LK阶段如何使用ADC介绍
- 哇,union的优先级很高嘛
- 【Python3_基础系列_012】Python3-异常与断言
- GFM与博客园markdown测试
- Java JDBC工具类
- 精选JAVA毕业设计83套——源码+论文完整资源
- java 生成随机数 (Random函数)
- js微信抢红包脚本代码_autojs抖音抢红包脚本!源码分享
- PAT(甲级)2021年冬季考试 7-2 Rank a Linked List
- 顺序匹配网络:基于检索的聊天机器人中多回合响应选择的新架构
- ubuntu安装使用redis并设置开机启动
- 最新注册谷歌账号详细步骤,解决“此电话号码无法验证”问题
- 计算机科学报数学竞赛,五大学科竞赛参加哪一个科目?五大学科竞赛赛程设置分析!...
- Centos升级安装Openssh9.0p1
- matlab怎么读txt文件字符串,Matlab中读取txt文件的几种方法
- 硕士毕业论文参考文献整理、插入以及各种相关心得(限武汉大学EndNote软件)
- 跨时钟域信号处理---脉冲同步器详解
- 谈谈本科生和研究生的差距
- word同类标题另起一页
热门文章
- 第四篇,STM32中断控制编程
- ahk写的脚本win11需要以管理员运行才能生效,有什么办法能默认用管理员身份运行吗
- vue解决两个字和三个字对齐问题
- 忠诚和勤奋是你成就事业的唯一机会
- 海沧e政务终端服务器都在哪里,厦门e政务便民服务站延伸到海沧区和集美区了...
- 目标跟踪之相关滤波:CF及后续改进篇
- Python程序退出时执行指定代码
- 家庭自建流媒体服务器,如何创建自己的“家庭媒体流服务器”使用Plex与FreeNAS - 第3部分...
- 般若波罗蜜多心经白话译文
- BI报表之电网大屏显示制作