1、切点定义

切点定义包含两个部分

一个切入点表达式

一个包含名字和任意参数的方法签名

package com.sysker.aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut; @Aspect
public class CreatePointcut {
@Pointcut("execution(* transfer(..))")
private void anyOldTransfer() { }
}
  • 在@AspectJ风格的AOP中,切入点签名采用一个普通的方法定义(方法体通常为空)来提供,且该方法的返回值必须是void;切入点表达式需要使用@Point注解来标注,如上代码
  • 切入点表达式,也就是@Pointcut 注解的值,是正规的AspectJ 切入点表达式
  • 如果需要使用本切面类中的切入点,则可以在使用@Before、@After、@Around等注解定义Advice时,使用pointcut或value属性值引用已有的切入点
package com.sysker.aspect;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut; @Aspect
public class CreatePointcut {
@Pointcut("execution(* transfer(..))")
private void anyOldTransfer() {} @Pointcut("execution(* transfer(..))")
public void myPointcut() {} @AfterReturning(pointcut = "mypointcut()", returning = "retVal")
public void writeLog(String msg, Object retVal) { }
}
  • private修饰的切点,其他切面类不能使用,而且在引用其他切面类中的切点时,必须添加类名前缀
    @After(value="CreatePointcut.myPointcut()")
public void show() {
System.out.println("myPointcut模拟释放资源");
}

2、切入点指示符

2.1 execution:匹配执行方法的连接点,用法相对复杂,表达式如下:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
  • modifiers-pattern:指定方法的修饰符,支持通配,该部分可省略;
  • ret-type-pattern:指定方法的返回值类型,支持通配符,可以使用“*”通配符来匹配所有的返回值类型
  • declaring-type-pattern:指定方法所属的类,支持通配符,该部分可省略;
  • name-pattern:指定匹配指定的方法名,支持通配,可以使用“*”通配符来匹配所有方法
  • parapn-pattern:指定方法声明中的形参列表,支持两个通配符,即“*”和“..”,其中“*”代表一个任意类型的参数,而(..)代表零个或多个任意类型的参数
  • throws-pattern:指定方法声明抛出的异常,支持通配符,该部分可省略

2.2 within:用于限定匹配特定类型的连接点,当使用Spring AOP的时候,只能匹配方法执行的连接点

// 在com.sysker.service包中的任意连接点(在Spring AOP中只是方法执行的连接点)
within(com.sysker.service.*)
// 在com.sysker.service包或其子包中的任意连接点(在Spring AOP中只是方法执行的连接点)
within(com.sysker.service..*)

2.3 this:用于限定AOP代理必须指定类型的实例,匹配该对象的所有连接点,当使用Spring AOP的时候,只能匹配方法执行的连接点

// 匹配实现了 com.sysker.service.AccountService接口的AOP代理的所有连接点
// 在SpringAOP中只是方法执行的连接点
this(com.sysker.service.AccountService)

2.4 target:用于对连接点的参数类型进行限制,要求参数类型是指定类型的实例,当使用Spring AOP的时候,只能匹配方法执行的连接点

// 匹配实现了 com.sysker.service.AccountService.AccountService 接口的目标对象的所有连接点
// 在Spring AOP中只是方法执行的连接点
target(com.sysker.service.AccountService.AccountService)

2.5 args:用于对连接点的参数类型进行限制,要求参数类型是指定类型的实例。当使用Spring AOP的时候,只能匹配方法执行的连接点。

// 匹配只接受一个参数,且传入的参数类型是serializable
// 在Spring AOP中只是方法执行的连接点
target(com.sysker.service.AccountService.AccountService)

2.6 bean:用于限定只匹配指定bean实例内的连接点,实际上只能使用方法执行行为作为连接点

  • 定义bean表达式时需要传入bean的id或name,表示只匹配该bean实例内的连接点,支持使用“*”通配符
// 匹配tradeService Bean实例内方法执行的连接点
bean(tradeService)
// 匹配名字以service结尾的Bean实例内方法执行的连接点
bean(*Service)

3 组合切入点表达式

&& :要求连接点同时匹配两个切入点表达式

|| :只要连接点匹配任意一个切入点表达式

! : 要求连接点不匹配指定的切入点表达式

AOP切点相关的更多相关文章

  1. 如何通过自定义注解实现AOP切点定义

    面向切面编程(Aspect Oriented Programming, AOP)是面向对象编程(Object Oriented Programming,OOP)的强大补充,通过横切面注入的方式引入其他 ...

  2. springboot+aop切点记录请求和响应信息

    本篇主要分享的是springboot中结合aop方式来记录请求参数和响应的数据信息:这里主要讲解两种切入点方式,一种方法切入,一种注解切入:首先创建个springboot测试工程并通过maven添加如 ...

  3. Spring AOP 切点(pointcut)表达式

    这遍文章将介绍Spring AOP切点表达式(下称表达式)语言,首先介绍两个面向切面编程中使用到的术语. 连接点(Joint Point):广义上来讲,方法.异常处理块.字段这些程序调用过程中可以抽像 ...

  4. Spring AOP切点表达式用法总结

    1. 简介        面向对象编程,也称为OOP(即Object Oriented Programming)最大的优点在于能够将业务模块进行封装,从而达到功能复用的目的.通过面向对象编程,不同的模 ...

  5. AOP切点表达式

    Aspectj切入点语法定义 在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点" 例如定义切入点表达式  execu ...

  6. Spring Aop切点

    切点用于准确定位应该在什么地方应用切面的通知.通知和切点是切面的最基本的元素.在Spring AOP中要使用AspectJ的切点表达式来定义切点.下面我们列出Spring AOP所支持的AspectJ ...

  7. Spring系列25:Spring AOP 切点详解

    本文内容 Spring 10种切点表达式详解 切点的组合使用 公共切点的定义 声明切点@Poincut @Poincut 的使用格式如下: @Poincut("PCD") // 切 ...

  8. 使用注解匹配Spring Aop切点表达式

    Spring中的类基本都会标注解,所以使用注解匹配切点可以满足绝大部分需求 主要使用@within()/@target @annotaton() @args()等... 匹配@Service类中的所有 ...

  9. Spring基于AspectJ的AOP的开发之AOP的相关术语

    1. Joinpoint(连接点) -- 所谓连接点是指那些被拦截到的点.在spring中,这些点指的是方法,因为spring只支持方法类型的连接点(任何一个方法都可以称为连接点) 2. Pointc ...

随机推荐

  1. laravel 常用知识总结

    看到一篇别人的文章感觉写的不错 就copy过来了 学习源头: https://www.cnblogs.com/yjf512/p/3830750.html aravel是个很强大的PHP框架,它剔除了开 ...

  2. java代码继承难点。构造方法的调用

    总结:子类默认调用父类的无参构造方法.重写时,父类方法将被覆盖,不被调用,在子类中可以使用super.方法():可以实现 运行显示: evente.x:55 evente.x:55 B.y:57 pa ...

  3. 第十课 go语言函数

    1 内置函数 len() 函数可以接受不同类型参数并返回该类型的长度. 如果我们传入的是字符串则返回字符串的长度, 如果传入的是数组,则返回数组中包含的元素个数. 2  自定义函数 // 函数返回单个 ...

  4. mybatis 学习五 动态SQL语句

    3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的selectKey ...

  5. PD中更改显示Name还是Code的设置

    菜单->Tool->Model Options->Name Convention->右侧display中选择显示name还是code. 此外,在16版中,还可以通过Tool-D ...

  6. [CSS Hack]解決IE6、IE7、IE8、Firefox的瀏覽器相容性問題!

    每次調CSS最令人頭痛的就是瀏覽器校正問題,因為每個瀏覽器對CSS的解釋都不太一樣,Firefox本身算是比較照規矩來,處理上比較簡單,但是遇到微軟的IE系列頭就大了,雖然都是IE,但是IE6.IE7 ...

  7. eclipse 中文版 变成 英文版 方法

    找到目录运行命令 “eclipse.exe -nl en”

  8. Springboot中AOP统一处理请求日志

    完善上面的代码: 现在把输出信息由先前的system.out.println()方式改为由日志输出(日志输出的信息更全面) 现在在日志中输出http请求的内容 在日志中获取方法返回的内容

  9. git pull没有指定branch的报错

    执行git pull或者git push的时,有时候会出现如下报错: $ git pull You asked me to pull without telling me which branch y ...

  10. C++面向对象类的实例题目十

    题目描述: 编写一个程序,其中有一个汽车类vehicle,它具有一个需要传递参数的构造函数,类中的数据成员:车轮个数wheels和车重weight放在保护段中:小车类car是它的私有派生类,其中包含载 ...