读书人

Spring AOP 辨析(5)

发布时间: 2012-11-23 22:54:33 作者: rapoo

Spring AOP 剖析(5)

在动态代理 和 CGLIB 的支持下, Spring AOP 框架的实现经过了两代。

?

从 Spring AOP 框架第一次发布,到 Spring 2.0 发布之前的 AOP 实现,是 Spring 第一代 AOP 实现。

?

Spring 2.0 发布后的 AOP 实现是第二代。

?

但是,Spring AOP 的底层实现机制一直没有变,唯一改变的,是各种 AOP 概念实现的表现形式以及 Spring AOP? 的使用


方式。

?

?

Spring AOP 的底层实现机制

?

?

1. Spring AOP 中的 Joinpoint

?

Spring AOP 中,仅支持方法级别的 Joinpoint ,更确切的说,只支持方法执行 (Method Execution )类型的 Joinpoint

?

虽然 Spring AOP 仅提供方法拦截,但是实际的开发过程中,这已经可以满足 80% 的开发需求了。Spring AOP 之所以

?

如此,主要有以下几个原因。

?

a.? Spring AOP 要提供一个简单而强大的 AOP 框架,并不想因大而全使得框架本身过于臃肿。能够仅付出 20% 的

?

努力,就能够得到 80% 的回报。否则,事倍功半,并不是想看到的结果。

?

b.? 对于类中属性 (Field )级别的 Joinpoint ,如果提供这个级别的拦截,那么就破坏了面向对象的封装,而且,完全

?

可以通过 setter 和 getter 方法的拦截达到同样的目的。

?

c.?? 如果应用需求非常特殊,完全超出了 Spring AOP 提供的那 80% 的需求支持,可以求助于现有其他 AOP 实现产品,

?

如 AspectJ。 目前看来, AspectJ 是 Java 平台对 AOP 支持最完善的产品,同时,Spring AOP 也提供了对 Aspect

?

的支持。

?

?

?

2.? Spring AOP 中的 Pointcut

?

Spring 中以接口 org.springframework.aop.Pointcut 作为其 AOP 框架中的所有 Pointcut 的最顶层抽象。

?

?

部分资料说明? AbstractRegexpMethodPointcut 还有个 子类? Perl5RegexpMethodPointcut,但是我在

?

Spring 3.0.5 包中没有看到此类。

?

从上图中看出 Spring 提供了集中常见的 Pointcut 实现 (浅红色的类图 )。


1.? NameMatchMethodPointcut

?

最简单的 Pointcut 实现,根据自身指定的一组方法名称与 Joinpoint 处的方法的名称进行匹配,支持“*”通配符实现简单

?

的模糊匹配。

?

?

?


4.?? ComposablePointcut

?

ComposablePointcut 是 Spring AOP 提供的可以进行 Pointcut 逻辑运算的 Pointcut 实现, 它可以进行 Pointcut

?

之间的 “并” 以及 “交” 运算。

?

?

如果在 ControlFlowPointcut 的构造方法中单独指定 Class 类型的参数,如上面的例子,那么 ControlFlowPointcut

?

将尝试匹配指定的 Class 中声明的所有方法,跟目标对象的 Joinpoint 处的方法流程组合。 所以,如果是想要做到

?

“只有 TargetCaller 类的 callMethod 方法调用 TargetObject.method1() 才拦截,而 TargetCaller 的其他方法

?

全都忽略” 的话,可以在构造时,传入第二个参数

?

ControlFlowPointcut pointcut = new ControlFlowPointcut(TargetCaller.class, "callMethod");

?

因为 ControlFlowPointcut 类型的 Pointcut 需要在运行期间检查程序的调用栈,而且每次方法调用都需要检查,所以


性能比较差,应该尽量避免使用。

?

?

太长了。。。下回待续。O(∩_∩)O~

读书人网 >软件架构设计

热点推荐