快速业务通道

J2EE中使用Spring AOP框架和EJB组件 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
responseCode+" "+responseMessage); } String response = readResponse(conn); Matcher matcher = pattern.matcher(response); if(!matcher.find()) { throw new RuntimeException("Unable to parse response ["+response+"] for symbol "+symbol); } String time = matcher.group(1); if("N/A".equals(time)) { return null; // unknown symbol } String price = matcher.group(2); return new BigDecimal(price); } public void setPrice(String symbol, BigDecimal price) { throw new UnsupportedOperationException ("Can''t set price of 3rd party trade"); } private String readResponse(HttpURLConnection conn) { // ... return response; } }

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

时间:2011-01-13 BEA Eugene Kuleshov

完成这种实现并测试(在容器外部!)之后,就可以把它与其他组件进行集成。传统的做法是向TradeManager2Impl添加一些代码,以便检查getPrice()方法返回的值。这会使测试的次数至少增加一倍,而且要求为每个测试用例设定附加的先决条件。然而,如果使用Spring AOP框架,就可以更漂亮地完成这项工作。您可以实现一条通知,如果初始的TradeManager没有返回所请求符号的值,该通知将使用YahooFeed组件来获取价格(在这种情况下,它的值是null,但是也可能会得到一个UnknownSymbol异常)。

要把通知应用到具体的方法,需要在Spring的bean配置中声明一个Advisor。有一个方便的类叫做NameMatchMethodPointcutAdvisor,它允许通过名称选择方法,在本例中还需要一个getPrice方法:

<bean id="yahooFeed" class="org.javatx.spring.aop.YahooFeed"/> <bean id="foreignTradeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <property name="mappedName" value="getPrice"/> <property name="advice"> <bean class="org.javatx.spring.aop.ForeignTradeAdvice"> <constructor-arg index="0" ref="yahooFeed"/> </bean> </property> </bean>

正如您所看到的,上面的advisor指派了一个ForeignTradeAdvice给getPrice()方法。针对通知类,Spring AOP框架使用了AOP Alliance API,这意味着环绕通知的ForeignTradeAdvice应该实现MethodInterceptor接口。例如:

public class ForeignTradeAdvice implements MethodInterceptor { private TradeManager tradeManager; public ForeignTradeAdvice(TradeManager manager) { this.tradeManager = manager; } public Object invoke(MethodInvocation invocation) throws Throwable { Object res = invocation.proceed(); if(res!=null) return res; Object[] args = invocation.getArguments(); String symbol = (String) args[0]; return tradeManager.getPrice(symbol); } }

上面的代码使用invocation.proceed()调用了一个原始的组件,而且如果它返回null,它将调用另一个在通知创建时作为构造函数参数注入的tradeManager。参见上面foreignTradeAdvisor bean的声明。

现在可以把在Spring的bean配置中定义的tradeManager重新命名为baseTradeManager,然后使用ProxyFactoryBean把tradeManager声明为一个代理。新的baseTradeManager将成为一个目标,我们将使用上面定义的foreignTradeAdvisor通知它:

<bean id="baseTradeManager" class="org.javatx.spring.aop.TradeDao&quo

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号