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、指示器逻辑运算符
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throw-pattern?)
*:表示任意名字
..:任意段的任意字符,匹配任何数量字符的重复,如在类型模式中匹配任何数量子包;而在方法参数模式中匹配任何数量参数。
+:匹配指定类型的子类型;仅能作为后缀放在类型模式后边。
5、常见例子
-
execution(public * *(..)):找到所有的公有方法
-
execution(* *get(..)):
-
public * com.service.emp.EmployeeService+.*(..))
-
表示接口的所有方法以及此接口实现类自己的方法都会被aop代理
-
public * com.service...(..)) 表示com.service包以及子孙包下
-
within( com.service..*) 表示com.service包以及子孙包下的所有类, 写法与execution指示器是不同的,不需要写返回类型
-
target( com.service.emp.impl.EmployeeServiceImpl) 给EmployeeServiceImpl 进行aop代理,不能使用通配符.表达式中指定父类型或者接口时是可以的.
-
this(com.service.emp.impl.EmployeeServiceImpl):给EmployeeServiceImpl类 进行aop代理.写法与target类似. 意思是:如果能代理成功,那么生成的代理类是表达式里面设定的类型的实例
-