第三章 Spring AOP
1
AOP概念
Aspect Oriented Programming(AOP)是近来较为热门的一个话题。AOP,国内大致译作“面向方面编程”
而在AOP中,Aspect的含义,理解为“切面”比较合适。所以更倾向于“面向切面编程”的译法。
2
AOP与OOP区别
OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。
而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。
这两种设计思想在目标上有着本质的差异。
3
AOP和OOD/OOP并不冲突,我们完全可以在一个应用系统中同时应用OOD/OOP和AOP设计思想,通过OOD/OOP对系统中的业务对象进行建模,同时通过AOP对实体处理过程中的阶段进行隔离处理。即使不是OOD/OOP,而是在传统的POP(面向过程编程)中,AOP也能起到同样的作用。
将不同阶段领域加以分隔,这是否就算是AOP呢?
AOP还有另外一个重要特点:源码组成无关性
4
倘若应用中通过某个具体的业务逻辑类实现了独立的权限检查,而请求调度方法通过预编码调用这个权限模块实现权限管理。那么这也不算是AOP。对于AOP组件而言,很重要的一点就是源码组成无关性,所谓源码组成无关性,体现在具体设计中就是AOP组件必须与应用代码无关,简单来讲,就是应用代码可以脱离AOP组件独立编译。
5
为了实现源码组成无关性,AOP往往通过预编译方式(如AspectJ)和运行期动态代理模式(如Spring AOP 和JBoss AOP)实现。
静态代理
JDK动态代理
CGLib动态代理
6
public class LogHandler implements InvocationHandler {
private Logger logger = (().getName());
private Object delegate;
public Object bind(Object delegate){
= delegate;
return (().getClassLoader(), ().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
log("method starts..." + method);
result = (delegate, args);
log("method ends..." + method);
return result;
}
private void log(String msg){
(,msg);
}
}
7
LogHandler handler = new LogHandler();
IHello hello = (IHello)(new Hello());
("tom");
8
AOP的重要概念
1. 切面(Aspect)
切面,对象操作过程中的截面。这可能是AOP中最关键的一个术语。
我们首先来看一个应用开发中常见的切面:用户权限检查。大概只要是完整的应用,都少不了用户权限检查这个模块,不同身份的用户可以做什么,不可以做什么,均由这个模块加以判定。而这个模块调用的位置通常也比较固定:用户发起请求之后,执行业务逻辑之前。
针对权限检查这一模块进行分离,我们就得到了一个切面:
9
10
Spring AOP 来自淘豆网m.daumloan.com转载请标明出处.