快速业务通道

AOP@Work: 用AspectJ和Spring进行依赖项插入 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
插入应用字段级插入。字 段的 get 连接点让我可以确定什么时候进行插入,而字段类型可以确定要插入 的依赖项。所以,如果客户声明了这样的一个字段:

private PricingStrategy pricingStrategy;

而在客户的方法中,发现了 下面的代码

this.pricingStrategy.price(.....);

那么代码在运行时的执行会形成 pricingStrategy 字段的 get() 连接点,我可以用它插入当前报价策略实现, 如清单 7 所示:

AOP@Work: 用AspectJ和Spring进行依赖项插入(7)

时间:2011-09-07 IBM Adrian Colyer

清单 7. 字段级插入示例

public aspect PricingStrategyInjector { private PricingStrategy currentPricingStrategy; public void setCurrentPricingStrategy(PricingStrategy aStrategy) { this.currentPricingStrategy = aStrategy; } /** * a client is trying to access the current pricing strategy */ pointcut pricingStrategyAccess() : get(PricingStrategy *) && !within(PricingStrategyInjector); // don’t advise ourselves! /** * whenever a client accesses a pricing strategy field, ensure they * get the latest... */ PricingStrategy around() : pricingStrategyAccess() { return this.currentPricingStrategy; } }

请参阅 下载 获得这个技术的实际效果。

服务定位策略

重复插入的一个替代就是用更常规的技术,用服务定位策略技术实现插入客 户。例如:

public interface PricingStrategyLocator { PricingStrategy getCurrentPricingStrategy(); }

虽然代价是定义一个额外接口,还会使客户代码更长一些,但是 这项技术对于代码清晰性来说具有优势。

结束语

在这篇文章中,我把依赖项插入看作对象和对象执行的环境之间的合约。对 象不愿意外出寻找自己需要的资源、要协作的合作伙伴或者使用的服务。相反, 对象提供了一种机制,允许把这些依赖项提供给它。然后,在对象需要依赖项之 前,执行环境负责把对象需要的所有依赖项提供给它。

我讨论了依赖项插入解决方案的四个关键职责,这些是代理代表对象获取依 赖项时必须解决的问题。最后,我介绍了满足这些需求的许多不同的技术。显然 ,如果能够 用 Spring 容器初始化并配置对象,那么就应当这么做。对于在 Spring 容器的控制之外创建的对象,例如一些使用非单体实例化模型的域对象 或方面,我推荐使用 @SpringConfigured 标注或类似的东西。这项技术让您可 以把全部配置信息完全转移到外部的 Spring 配置文件中。

在编写这篇文章的示例时,我采用了 AspectJ 5 的最新里程碑版(到 2005 年 10 月)和 Spring 1.2.4。请 下载 完整的工作示例,开始体验我讨论的想 法。testsrc 目录下的测试用例是良好的起点。

代码下载:http://www.ibm.com/developerworks/cn/java/j- aopwork13.html

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号