J2EE中使用Spring AOP框架和EJB组件(6)
J2EE中使用Spring AOP框架和EJB组件(6)
[@more@]
组合和链接通知
我们已经使用了一个简单的拦截器通知来实现附加的逻辑,并且将其当作一个独立的组件进行了测试。当应该在不进行修改并且与其他组件没有附加耦合的情况下扩展公共执行流时,这种设计十分有效。例如,当价格已经发生变化时,如果需要使用JMS或JavaMail发送通知,我们可以在tradeManager bean的setPrice方法上注册另一个拦截器,并使用它来向相关组件通知有关这些变化的情况。在很多情况下,这些方面都适用于非功能性需求,比如许多AOP相关的文章和教程中经常用作“hello world”例子的跟踪、登录或监控。
另一个传统的AOP应用程序是缓存。例如,一个基于CMP实体bean的TradeDao组件将从WebLogic Server提供的缓存功能中受益。然而对于YahooFeed组件来说却并非如此,因为它必须通过Internet连接到雅虎门户。这明显是一个应该应用缓存的位置,而且它还允许减少外部连接的次数,并最终降低整个系统的负载。注意,基于截至时间的缓存也会在刷新信息时带来一些延迟,但是在很多情况下,它仍然是可以接受的。要应用缓存功能,可以定义一个yahooFeedCachingAdvisor,它将把CachingAdvice附加到yahooFeed bean上的getPrice()方法。在“下载”部分中,您可以找到一个CachingAdvice实现的例子。
<bean id="getPriceAdvisor" abstract="true" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <property name="mappedName" value="getPrice"/> </bean> <bean id="yahooFeedCachingAdvisor" parent="getPriceAdvisor"> <property name="advice"> <bean class="org.javatx.spring.aop.CachingAdvice"> <constructor-arg index="0" ref="cache"/> </bean> </property> </bean> |
因为getPrice()方法已经成为几种通知的公共联结点,所以声明一个抽象的getPriceAdvisor bean,然后在yahooFeedCachingAdvisor中对其进行扩展,指定具体的通知CachingAdvice。注意,也可以修改前面的foreignTradeAdvisor,使其使用同一个getPriceAdvisor父bean。
现在可以更新yahooFeed bean的定义,并将它包装在一个ProxyFactoryBean中,然后使用yahooFeedCachingAdvisor通知它。例如:
<bean id="yahooFeed" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces" value="org.javatx.spring.aop.TradeManager"/> <property name="target"> <bean class="org.javatx.spring.aop.YahooFeed"> </property> <property name="interceptorNames"> <list> <value>yahooFeedCachingAdvisor</value> </list> </property> </bean> |
当请求命中已经保存在缓存中的数据时,上面的修改将极大地提高性能,但是如果传入多个针对同一个符号的请求,而该符号尚未进入缓存或者已经到期,我们将看到多个并发的请求到达服务提供者,请求同一个符号。对此,存在一种显而易见的优化,就是中断对同一个符号的所有请求,直到第一个请求完成为止,然后使用第一个请求获得的结果。EJB规范(参见“Programming Restrictions”,2.1版本的25.1.2部分)一般不推荐使用这种方法,因为它对运行在多个JVM上的集群环境不奏效。然而,至少在单个的节点中这种优化可以改进性能。图2所示的图表对比说明了优化之前和优化之后的情况:
498)this.style.width=498;" />
图2:优化之前和优化之后
该优化也可以实现为通知,并添加在yahooFeed bean中的拦截器链的末端:
... <property name="interceptorNames"> <list> <idref local="yahooFeedCachingAdvisor"/> <idref local="syncPointAdvisor"/> </list> </property> |
实际的拦截器实现应该像下面这样:
public class SyncPointAdvice implements MethodInterceptor { private long DEFAULT_TIMEOUT = 10000L; private Map requests = Collections.synchronizedMap(new HashMap()); public Object invoke(MethodInvocation invocation) throws Throwable { String symbol = (String) invocation.getArguments()[0]; Object[] lock = (Object[]) requests.get(symbol); if(lock==null) { lock = new Object[1]; requests.put(symbol, lock); try { lock[0] = invocation.proceed(); return lock[0]; } finally { requests.remove(symbol); synchronized(lock) { lock.notifyAll(); } } } synchronized(lock) { lock.wait(DEFAULT_TIMEOUT); } return lock[0]; } } |
可以看出,通知代码相当简单,而且不依赖于其他的组件,这使得JUnit测试变得十分简单。在“参考资料”部分,您可以找到SyncPointAdvice的JUnit测试的完整源代码。对于复杂的并发场景来说,使用Java 5中java.util.concurrent包的同步机制或者针对老的JVM使用其backport是一种不错的做法。
结束语
本文介绍了一种把J2EE应用程序中的EJB转换为Spring托管组件的方法,以及转换之后可以采用的强大技术。它还给出了几个实际的例子,说明如何借助于Spring的AOP框架、应用面向方面的方法来扩展J2EE应用程序,并在不修改现有代码的情况下实现新的业务需求。
在EJB中使用Spring Framework将减少代码间的耦合,并使许多强大的功能即时生效,从而提高可扩展性和灵活性。这还使得应用程序的单个组件变得更加易于测试,包括新引入的AOP通知和拦截器,它们用于实现业务功能或者处理非功能性的需求,比如跟踪、缓存、安全性和事务。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7839366/viewspace-919846/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7839366/viewspace-919846/
J2EE中使用Spring AOP框架和EJB组件(6)相关推荐
- J2EE中使用Spring AOP框架和EJB组件(1)
J2EE中使用Spring AOP框架和EJB组件(1) [@more@]本文介绍了一种把J2EE应用程序中的EJB转换为Spring托管组件的方法,以及转换之后可以采用的强大技术.它还给出了几个实际 ...
- 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 ...
最新文章
- php使用位运算来实现日留存的算法
- sidhu眼中的CoordinatorLayout.Behavior(二)
- 乌班图linux配置yum仓库,Linux系统的仓库配置(yum、epel)与软件安装(wireshark,wget,nginx)...
- matlab 最小二乘法拟合_计量与论文串讲:最小二乘法
- apache php的日志在哪里,PHP在哪里存储错误日志? (php5,apache,fastcgi,cpanel)...
- 1034 有理数四则运算 (20 分)java
- shell 数据类型
- Git是目前世界上最先进的分布式版本控制系统(没有之一)。
- 医疗大数据分析需考虑哪些因素
- 拓端tecdat|R语言关联挖掘实例(购物篮分析)
- 如何解决应用程序无法启动,因为应用程序的并行配置不正确?
- 如何沟通?如何商务谈判!《沃顿商学院最实用的谈判课》epub免费下载
- 计算机控制plc应用论文,PLC自动控制系系统在变频器中的运用
- BP神经网络逼近函数项目(含matlab代码)
- 使用python操作excel的xls文件和xlsx文件之间的批量导出和填充数据
- windows双击运行python脚本_Python脚本不能通过双击Windows来执行
- SecureFX 查看隐藏文件夹
- 2017年8月23日 星期三 --出埃及记 Exodus 29:2
- deepin efi 启动u盘_【2017.12.16】启动U盘简单手动制作BIOS+UEFI的syslinux/grub/boomgr/grub2互转...
- 海信计算机辅助统,海信计算机辅助手术系统(CAS)将覆盖山东三级医院