spring expression切点表达式

Posted 过期可乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring expression切点表达式相关的知识,希望对你有一定的参考价值。

1、切点指示器

类型如下:

1、execution:

*用来匹配连接点方法的,用的最多的一种指示器,可以匹配多个类,必须要写返回类型,方法名,方法参数,可以写通配符。

2、within

用来匹配符合条件的所有类的连接点方法,不可以指定返回类型和方法参数,可以用通配符。expression="within( com.pointcut.impl.*)",匹配com.pointcut.impl包下的所有类的连接点方法。

3、target

动态代理生成的对象,这种指示器一般表示某个动态代理对象是某个类型,比如this(com.service.EmployeeService),匹配所有EmployeeService的实现类。可以写接口,抽象类,父类类型,它的子类或实现类都会被匹配。不能写通配符。target(com.pointcut.impl.BookImpl)

4、this

target,匹配接口或抽象类,父类的实现类和继承类,不能写通配符。 不同的是: this(com.pointcut.impl.BookImpl)如果写实现类的全限定名的话,父类或抽象类未被重写Override的方法将不会匹配到,而 target能够匹配到。 因为: 使用“this(类型全限定名)”匹配当前AOP代理对象类型的执行方法。 使用“target(类型全限定名)”匹配当前目标对象类型的执行方法。

5、args

此指示器匹配对应的方法参数类型,比如args(integer,string),匹配所有带两个参数,并且类型是interger,string的连接点方法。

6、@target

用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解;

7、@args

用于匹配当前执行的方法传入的参数持有指定注解的执行;

8、@within

用于匹配所以持有指定注解类型内的方法;

9、@annotation

用于匹配当前执行方法持有指定注解的方法;

10、bean

指定bean进行aop代理,bean("emp")

 

2、指示器逻辑运算符

与and(&&)

或or(||)

非not(!)

 

3、指示器格式

不同的指示器,表达式的写法模式是不一样的。

execution

execution(modifiers-pattern?  ret-type-pattern  declaring-type-pattern?  name-pattern(param-pattern) throw-pattern?)

含义如下:

?代表有或者没有,没有问号就必须要写

modifiers-pattern? 修饰者模式 public....

ret-type-pattern 返回类型模式 void,String.....

declaring-type-pattern? 声明类型模式 static

name-pattern 方法名字模式

param-pattern方法参数模式

throw-pattern?方法抛出异常模式

 

4、通配符

*:表示任意名字

..:任意段的任意字符,匹配任何数量字符的重复,如在类型模式中匹配任何数量子包;而在方法参数模式中匹配任何数量参数。

+:匹配指定类型的子类型;仅能作为后缀放在类型模式后边。

 

5、常见例子

  1. execution(public * *(..)):找到所有的公有方法

  2. execution(* *get(..)):

  3. public * com.service.emp.EmployeeService+.*(..))

  • 表示接口的所有方法以及此接口实现类自己的方法都会被aop代理

  1. public * com.service...(..)) 表示com.service包以及子孙包下

  2. within( com.service..*) 表示com.service包以及子孙包下的所有类, 写法与execution指示器是不同的,不需要写返回类型

  3. target( com.service.emp.impl.EmployeeServiceImpl) 给EmployeeServiceImpl 进行aop代理,不能使用通配符.表达式中指定父类型或者接口时是可以的.

  4. this(com.service.emp.impl.EmployeeServiceImpl):给EmployeeServiceImpl类 进行aop代理.写法与target类似. 意思是:如果能代理成功,那么生成的代理类是表达式里面设定的类型的实例

  5. bean(emp)表示给emp这个bean进行aop代理

以上是关于spring expression切点表达式的主要内容,如果未能解决你的问题,请参考以下文章

Spring之AOP的切点通知切点表达式以及知识要点

Spring切点表达式

spring: @Pointcut给重复的注解/切点定义表达式

Spring AOP 切点指示器

Spring 中的切点表达式介绍

第四章:Spring AOP