表达式的要求:
关键字: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( .(parameters))

对于给定的作用域、返回值类型、完全限定类名以及参数匹配的方法将会应用切点函数指定的通知,这里给出模型案例:


@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(){}