《高级软件架构师讲义》学习笔记六-AOP开发实践
第六章 AOP开发实践
一、什么是AOP?
AOP是Aspect Oriented Programming的简写,中文通常译作面向方面编程,其核心内容就是所谓的“横切关注点”。
1. OO是纵向结构的
使用面向对象方法构建软件系统,我们可以利用OO的特性,很好的解决纵向的问题,因为,OO的核心概念,如继承等,都是纵向结构的。
2. AOP的目标
但是,在软件系统中,往往有很多模块,或者很多类共享某个行为,或者说,某个行为存在于软件的各个部分中,这个行为可以看作是“横向”存在于软件之中,他所关注的是软件的各个部分的一些共有的行为,而且,在很多情况下,这种行为不属于业务逻辑的一部分。
例如,操作日志的记录,这种操作并不是业务逻辑调用的必须部分,但是,我们却往往不得在代码中显式进行调用,并承担由此带来的后果(例如,当日志记录的接口发生变化时,不得不对调用代码进行修改)。
这种问题,使用传统的OO方法是很难解决的。AOP的目标,便是要将这些“横切关注点”与业务逻辑代码相分离,从而得到更好的软件结构以及性能、稳定性等方面的好处。
二、使用AOP实现松散耦合
1. AOP的自动耦合
AOP,给我们的软件设计带来了一个新的视角和软件架构方法。使用AOP,我们可以专注于
业务逻辑代码的编写,而将诸如日志记录、安全检测等系统功能交由AOP框架,在运行时刻自动耦合进来。
2. 使用AOP技术的情景
通常,我们可以在如下情景中使用AOP技术:
• Authentication 权限
• Caching 缓存
• Context passing 内容传递
• Error handling 错误处理
• Lazy loading 懒加载
• Debugging 调试
• logging, tracing, profiling and monitoring(记录跟踪,优化,校准)
• Performance optimization 性能优化
• Persistence 持久化
• Resource pooling 资源池
• Synchronization 同步
• Transactions 事务
3. OO设计的问题
对于应用软件系统来说,权限控制是一个常见的例子。为了得到好的程序结构,通常使用OO的方法,将权限校验过程封装在一个类中,这个类包含了一个校验权限的代码,例如然后,在业务逻辑过程中进行如下调用:这种做法在OO设计中,是常见的做法。但是这种做法会带来以下的问题:
public class Security
{
public bool CheckRight(User currentUser , Model accessModel ,
OperationType operation)
{
……//校验权限
}
}
public class BusinessClass
{
public void BusinessMethod()
{
Security s = new Security();
if (!s. CheckRight(……))
{
return ;
}
……//执行业务逻辑
}
}
• 不清晰的业务逻辑:从某种意义上来说,权限校验过程并不是业务逻辑执行
的一部分,这个工作是属于系统的,但是,在这种情况下,我们不得不把系
统的权限校验过程和业务逻辑执行过程掺杂在一起,造成代码的混乱。
• 代码浪费:使用这种方法,我们必须所有的业务逻辑代码中用Security类,使
得同样校验的代码充斥在整个软件中,显然不是很好的现象。
• 紧耦合:使用这种方法,我们必须在业务逻辑代码中显式引用Security类,这
就造成了业务逻辑代码同Security类的紧耦合,这意味着,当Security发生变
化时,例如,当系统进化时,需要对CheckRight的方法进行改动时,可能会
影响到所有引用代码。下面所有的问题都是因此而来。
• 不易扩展:在这里,我们只是在业务逻辑中添加了权限校验,哪一天,当我
们需要添加额外的功能,例如日志记录功能的时候,我们不得不同样在所有
的业务逻辑代码中添加这个功能。
• 不灵活:有的时候,由于某些特定的需要,我们需要暂时禁止,或者添加某
项功能,采用传统的如上述的做法,我们不得不采用修改源代码的方式来实
现。
4. 使用AOP组合两个业务逻辑
使用AOP,我们不仅仅可以用来分离系统功能和业务逻辑,也可以用来耦合不同的业务逻辑,得到更加灵活的软件结构。下面,我们通过一个具体的案例,来看看怎么通过AOP,组合两个业务逻辑过程。使用AOP,我们可以通过一种更加自然的方式来实现这个
目标。基本方法如下:
• 首先,编写相关的库存商品报废业务逻辑,不需要添加任何其他
的内容,并且,把这个逻辑的代码设置为可AOP的。
• 其次,按照正常的方式,编写财务处理逻辑。
• 添加一个把库存商品报废业务逻辑和财务处理逻辑组合起来的
Aspect,这个Aspect可以拦截库存商品报废业务逻辑的执行,动
态的加入财务处理逻辑的过程,并且,在配置文件中进行配置。
• 这样,我们就通过一个Aspect,组合了这两个业务逻辑。并且,
我们随时可以通过修改配置文件的方式把财务处理从库存商品报
废业务逻辑中去除,而不用修改任何代码。
三、对象代理和过滤器
1. 应该认识到,完全的AOP实现,需要开发语言的支持。因为对于AOP的研究,还正在进行之中,目前的开发语言,都还没有完全支持AOP的,但是,我们可以利用现有的一些语言功能,来实现AOP的部分功能。
2. 上面所举的例子,在实现上,是利用了对象代理(Proxy)机制。所谓Proxy,就是“为其他对象提供一种代理以控制对这个对象的访问”
四、结论
AOP给了我们一个新的视角来看待软件的架构,有的时候,即使不使用AOP技术,只使用AOP的某些观念和现有的技术来搭建系统架构,分离某些本来是紧耦合的关注点,对我们也是非常有益的。
文中介绍了一个.Net的AOP框架Websharp Aspect,不过在AOP框架这方面.Net好像没有Java阵营成熟。
原教程大家可以到豆丁网下载http://www.docin.com/p-1138875.html