表达式的要求:
关键字:execution(表达式)
表达式的写法:
标准写法:全限定方法名
访问修饰符 返回值 包名.包名.包名…类名.方法名(参数列表)
全匹配方式:
public void com.service.IAccountService.saveAccount()
访问修饰符可以省略
void com.service.IAccountService.saveAccount()
返回值可以使用,表示任意返回值
 com.service.IAccountService.saveAccount()
包名可以使用,表示任意包。但是有几级包,需要写几个
 ...IAccountService.saveAccount()
包名可以使用..,表示当前包及其子包
 ..IAccountService.saveAccount()
类名和方法名都可以使用,表示任意类,任意方法
 ...()
参数列表可以使用具体类型
基本类型,直接写类型名称 int
引用类型,需要写全限定类名 java.lang.String
 
 ...(int)
参数列表可以使用,表示任意参数类型,但是必须有参数
 ...()
参数列表可以使用..,表示有无参数均可,有参数可以是任意类型
 ...(..)
全通配方式:
 ...(..)
 
实际开发中的切入点表达式写法:
 com.service.impl..(..)
 
参考:
https://blog.csdn.net/kjfcpua/article/details/7513273
 
 
1.通配符
 
在定义匹配表达式时,通配符几乎随处可见,如、.. 、+ ,它们的含义如下:
 
·    .. :匹配方法定义中的任意数量的参数,此外还匹配类定义中的任意数量包
execution(public  (..))//匹配com.zejian.dao包及其子包中所有类中的所有方法within(com.zejian.dao..)
·    + :匹配给定类的任意子类
within(com.zejian.dao.DaoUser+)
·    * :匹配任意数量的字符
within(com.zejian.service..)execution( set(*int))
 
 
 
2.类型签名表达式
为了方便类型(如接口、类名、包名)过滤方法,Spring AOP 提供了within关键字。其语法格式如下:
 
within(
 
 
 
 
type name 则使用包名或者类名替换即可,来点案例吧。
 
 
@Pointcut(“within(com.zejian.dao..*)”)
 
 
@Pointcut(“within(com.zejian.dao.UserDaoImpl)”)
 
 
@Pointcut(“within(com.zejian.dao.UserDaoImpl+)”)
 
 
@Pointcut(“within(com.zejian.dao.UserDao+)”)
 
 
 
3.方法签名表达式
 
如果想根据方法签名进行过滤,关键字execution可以帮到我们,语法表达式如下
 
execution(
 
对于给定的作用域、返回值类型、完全限定类名以及参数匹配的方法将会应用切点函数指定的通知,这里给出模型案例:
 
 
@Pointcut(“execution( com.zejian.dao.UserDaoImpl.(..))”)
 
 
@Pointcut(“execution(public  com.zejian.dao.UserDaoImpl.(..))”)
 
 
@Pointcut(“execution(public int com.zejian.dao.UserDaoImpl.(..))”)
 
 
@Pointcut(“execution(public  com.zejian.dao.UserDaoImpl.(int , ..))”)
 
 
4.其他指示符
·    bean:Spring AOP扩展的,AspectJ没有对于指示符,用于匹配特定名称的Bean对象的执行方法;
@Pointcut(“bean(Service)”)private void myPointcut1(){}
·    this :用于匹配当前AOP代理对象类型的执行方法;请注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配
@Pointcut(“this(com.zejian.spring.springAop.dao.UserDao)”)private void myPointcut2(){}
·    target :用于匹配当前目标对象类型的执行方法;
@Pointcut(“target(com.zejian.spring.springAop.dao.UserDao)”)private void myPointcut3(){}
·    @within:用于匹配所以持有指定注解类型内的方法;请注意与within是有区别的, within是用于匹配指定类型内的方法执行;
@Pointcut(“@within(com.zejian.spring.annotation.MarkerAnnotation)”)private void myPointcut4(){}
·    @annotation(com.zejian.spring.MarkerMethodAnnotation) : 根据所应用的注解进行方法过滤
@Pointcut(“@annotation(com.zejian.spring.annotation.MarkerAnnotation)”)private void myPointcut5(){}
切点指示符可以使用运算符语法进行表达式的混编,如and、or、not(或者&&、||、!),如下一个简单例子:
 
@Pointcut(“target(com.zejian.spring.springAop.dao.UserDao) !within(com.zejian.dao..)”)
private void myPointcut6(){}
 
@Pointcut(“target(com.zejian.spring.springAop.dao.UserDao)&&execution( com.zejian.spring.springAop.dao.UserDao.addUser(..))”)
private *void myPointcut7(){}
 
 
