1反模式
AOP用起来真是方便,通过切面分离了关注点,使业务代码变得简单直接,好处多多。但别忘了那句老话:会用锤子了,就看哪哪都是钉子。下面就是有过度设计之嫌,使用AOP反模式的一个例子。
比如现在已有一个ProductDAO保存商品信息的数据访问类,现在要加入一段逻辑,保存商品信息时还要通过SalerDAO多保存一个销售人员信息。想不改变ProductDAO中的遗留代码,使用AOP怎么样?在切面中调用SalerDAO,将商品相关的销售人员保存起来。
这个例子显然是重度使用了AOP,简单来说:AOP中的方面应该是与具体业务相关度不高的一些通用逻辑,这里的AOP会无端增加代码的复杂度和降低性能。所以设计者不能执著,因为以后是怎样的情况没有人知道。我们设计的时候也不要太执著于什么方式或模式,简单修改维护的代码就是好设计。
2常见作用域
以下是AOP常见的一些应用场景:
Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging 调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence 持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务
3总结
3.1识别关注点是关键
通过对系统需求和实现的识别,我们可以将模块中的这些关注点分为:核心关注点和横切关注点。对于核心关注点而言,实现这些关注点的模块是相互独立的,他们分别完成了系统需要的商业逻辑,这些逻辑与具体的业务需求有关。而对于日志、安全、持久化等关注点而言,他们却是商业逻辑模块所共同需要的,这些逻辑分布于核心关注点的各处。在AOP中,诸如这些模块,都称为横切关注点。应用AOP技术的关键就是要识别关注点。
通过利用AOP技术,改变了整个系统的设计方式。在分析系统需求之初,利用AOP的思想,分离出核心关注点和横切关注点。在实现了诸如日志、事务管理、权限控制等横切关注点的通用逻辑后,开发人员就可以专注于核心关注点,将精力投入到解决企业的商业逻辑上来。同时,这些封装好了的横切关注点提供的功能,可以最大限度地复用于商业逻辑的各个部分,既不需要开发人员作特殊的编码,也不会因为修改横切关注点的功能而影响具体的业务功能。
3.2不要太多的切面
也许你会认为AOP实在是太强大了,可以到处使用,从而设计出太多的方面,以至于当一个方法被调用时,都难以说清楚究竟执行了哪些代码。
这是很可怕的,“过犹不及”,这是典型的过度设计的毛病。通常情况下,很少有一个对象实例需要5个方面以上。况且过多的方面会影响性能。
在设计的时候,通常如下情况会设计成方面:
(1)大部分模块都需要使用的通用功能,包括系统级或模块级的功能
(2)预计目前的实现,在今后进行功能扩展的可能性很大的地方
3.3切面的正交性
如果多个方面互相影响,造成一些无法预测的结果,该怎么办?多个切入点的功能实现叠加起来,甚至造成错误?
对于这种情况,在设计AOP的时候要特别注意,要遵循连接点的正交模型:不同种类的连接点和不同种类的实现应该能够以任何顺序组合使用。换句话说,请保持你设计的方面的独立性,功能实现的独立性,不依赖于多个方面的执行先后顺序。
3.4对粗粒度对象使用
AOP通常用来对粗粒度的对象进行功能增强,比如对业务逻辑对象,拦截某个业务方法,进行功能增强,从而提高系统的可扩展性。
注意不要在细粒度的对象上使用AOP,比如对某个实体描述对象。在运行时,这种细粒度对象通常实例很多,比如可能有多条数据,这种情况下,使用AOP,会有大量的方法拦截带来的反射处理,严重影响性能。
例如在Struts2中对Action使用AOP。因为Action不用实现任何接口,所以需要采用Cglib生成动态代理。这样每个HTTP请求过来都会新建一个Action来处理请求,这会导致频繁生成动态代理,甚至PermSpace溢出。所以Action层可以用Struts2的Interceptor实现,慎用AOP。
3.5对团队开发的影响
利用AOP技术对离散的方面进行的分析将有助于为开发团队指定一位精于该项工作的专家。负责这项工作的最佳人选将可以有效利用自己的相关技能和经验。
参考资料
1由Spring AOP来说明AOP作用 各种实现的优缺点
http://iteye.blog.163.com/blog/static/1863080962012111062747461/
2 AOP技术基础
http://wayfarer.cnblogs.com/articles/241024.html
3这样使用AOP是否合理
http://www.cnblogs.com/henryfan/archive/2008/08/13/1267438.html#1286256
4 Spring3开发实战 之 第三章:AOP开发(2)