spring AOP 概述(二) Pointcut

  Pointcut(切点)决定Advice通知应该作用于哪个连接点,也就是说通过Pointcut来定义需要增强的方法

的集合,这些集合的选取可以按照一定的规则来完成。在这种情况下,Pointcut通常意味着标识方法,例如,这些

需要增强的地方可以由某个正则表达式进行标识,或根据某个方法名进行匹配等。

  为了方便用户使用,Spring AOP提供类具体的切点供用户使用,切点在Spring AOP中的类继承体系如下

Pointcut定义如下

 1 public interface Pointcut {
 2
 3     /**
 4      * Return the ClassFilter for this pointcut.
 5      * @return the ClassFilter (never {@code null})
 6      */
 7     ClassFilter getClassFilter();
 8
 9     /**
10      * Return the MethodMatcher for this pointcut.
11      * @return the MethodMatcher (never {@code null})
12      */
13     MethodMatcher getMethodMatcher();
14
15
16     /**
17      * Canonical Pointcut instance that always matches.
18      */
19     Pointcut TRUE = TruePointcut.INSTANCE;
20
21 }

  从接口定义中可以看到,需要返回一个MethodMatcher。对于Point的匹配判断功能,具体是由这个返回

的MethodMatcher来完成的,以正则表达式切点JdkRegexpMethodPointcut的实现原理为例,来具体了解

切点Pointcut的工作原理,继承关系如下

在JdkRegexpMethodPoint的基类StaticMethodMatcherPointcut的实现中

 1 public abstract class StaticMethodMatcherPointcut extends StaticMethodMatcher implements Pointcut {
 2
 3     private ClassFilter classFilter = ClassFilter.TRUE;
 4
 5
 6     /**
 7      * Set the {@link ClassFilter} to use for this pointcut.
 8      * Default is {@link ClassFilter#TRUE}.
 9      */
10     public void setClassFilter(ClassFilter classFilter) {
11         this.classFilter = classFilter;
12     }
13
14     public ClassFilter getClassFilter() {
15         return this.classFilter;
16     }
17
18
19     public final MethodMatcher getMethodMatcher() {
20         return this;
21     }
22
23 }

可以看到,设置MethodMatcher为StaticMethodMatcher,同时JdkRegexpMethodPointcut也是这个MethodMatcher的子类

  看出来,在Pointcut中,通过这样的类继承关系,MethodMatcher对象实际上是可以被配置成JdkRegexpMethodPointcut来完成方法的匹配判断的。在JdkRegexpMethod

-Point中,可以看到一个matches方法,这个matches方法是MethodMatcher定义的接口方法。在JdkRegexpMethodPointcut的实现中,这个matches方法就是使用正则

表达式来对方法名进行匹配的地方。关于在AOP框架中对matches方法的调用,调用关系如下

  在对matches方法的调用关系中可以看到,是在JdkDynamicAopProxy的invoke方法中触发了对matches方法的调用。这个invoke方法就是Proxy对象进行代理回调的入口

方法,这个invoke回调的实现是使用JDK动态代理完成的

  在Spring AOP中,还提供类其他的MethodPointcut,比如通过方法名匹配进行Advice匹配的NameMatchMethodPointcut等。

原文地址:https://www.cnblogs.com/toUpdating/p/9763259.html

时间: 2024-08-05 19:03:22

spring AOP 概述(二) Pointcut的相关文章

深入理解Spring AOP之二代理对象生成

深入理解Spring AOP之二代理对象生成 spring代理对象 上一篇博客中讲到了Spring的一些基本概念和初步讲了实现方法,当中提到了动态代理技术,包含JDK动态代理技术和Cglib动态代理 动态代理这部分我有过一篇博客介绍:动态代理,想深入了解的朋友能够看一看,再回想一下,Spring中怎样区分採用JDK动态代理和CGlib动态代理: 假设目标对象的实现类实现了接口.Spring AOP 将会採用 JDK 动态代理来生成 AOP 代理类: 假设目标对象的实现类没有实现接口,Spring

Spring AOP概述

编程语言的终极目标就是能以更自然.更灵活的方式模拟世界,从原始机器语言到过程语言再到面向对象语言,编程语言一步步地用更自然.更灵活的方式编写软件.AOP 是软件开发思想发展到一定阶段的产物,但 AOP 的出现并不是要完全替代 OOP,而仅作为 OOP 的有益补充.虽然 AOP 作为一项编程技术已经有多年的历史,但长时间停留在学术领域,直到近几年,AOP 才作为一项真正的实用技术在应用领域开疆拓土.需要指出的是,AOP 是有特定的应用场合的,它只适合那些具有横切逻辑的应用场合,如性能监测.访问控制

spring AOP概述和简单应用

引用概念: http://www.cnblogs.com/hongwz/p/5764917.html AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入封装.继承.多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合.不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能.日志代码往往横向地散布在所有对象层次中,而与它对

Spring(十七):Spring AOP(二):通知(前置、后置、返回、异常、环绕)

AspectJ支持5种类型的通知注解: @Before:前置通知,在方法执行之前执行: @After:后置通知,在方法执行之后执行: @AfterRunning:返回通知,在方法返回结果之后执行(因此该通知方法在方法抛出异常时,不能执行): @AfterThrowing:异常通知,在方法抛出异常之后执行: @Around:环绕通知,围绕着方法执行. @Before:前置通知 @After:后置通知 @AfterRunning:返回通知 @AfterThrowing:异常通知 @Around:环绕

Spring AOP中pointcut expression表达式解析

Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的. Pointcut可以有下列方式来定义或者通过&& || 和!的方式进行组合. args() @args() execution() this() target() @target() within() @within() @annotation 其中execution 是用的最多的,其格式为: execution(modifiers-patt

Spring AOP的本质

不用再百科什么AOP了,我先推荐几篇文章或者系列文章:(感谢这些博文的原作者) 0.  Spring AOP 详解   http://pandonix.iteye.com/blog/336873/ 1.  AOP技术基础系列     http://wayfarer.cnblogs.com/articles/241024.html 2.  我对AOP的理解 http://jinnianshilongnian.iteye.com/blog/1474325 3.  Spring AOP本质系列  ht

Spring AOP深入理解之拦截器调用

Spring AOP深入理解之拦截器调用 Spring AOP代理对象生成回想 上一篇博客中:深入理解Spring AOP之二代理对象生成介绍了Spring代理对象是怎样生成的,当中重点介绍了JDK动态代理方式,简单回想下代理对象生成过程: 1.上面讲到了两种生成代理对象的方法,一种是通过ProxyFactory,一种是通过ProxyFactoryBean. 第一种获取比較简单,可是须要手工的进行写代码.而另外一种是通过Spring的IOC机制来控制Bean的生成. 2.不管是ProxyFact

Spring(十九):Spring AOP(三):切面的优先级

背景: 1)指定切面优先级示例:有的时候需要对一个方法指定多个切面,而这多个切面有时又需要按照不同顺序执行,因此,切面执行优先级别指定功能就变得很实用. 2)重复使用切入点表达式:上一篇文章中,定义前置.后置.返回.异常通知的切入点表达式时,都使用了同一个:而且本章节新加入的验证切面ValidateAspect类,也使用同一个切入点表达式,怎么让他们重用呢? 指定切面优先级示例: 比如在算术计算器执行计算之前进行数据验证,验证完事之后才让执行日志输出. 新建spring aop项目参考:<Spr

[Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习. 一, AspectJ的概述: AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. Spring为了简化自身的AOP的开发,将AspectJ拿过来作为Spring自身一个AOP的开发.