spring aop学习2:切面表达式(Pointcut express)

一.表达式分类
切面表达式也可以直接写在Advice通知注解中

1.designators(指示器,比较复杂,后面专讲)
2.wildcards(通配符)
  ◆ * :匹配任意数量的字符
  ◆ + 匹配指定类及其子类
  ◆ .. 匹配任意数的子包(多级目录)或者参数
3.operators(运算符)
  ◆ && 与
  ◆ || 或
  ◆ ! 非

二.表达式分类designators的专讲
1.匹配方法:最常用
  ◆execution()
    a.表达式结构:带问号的都是可选的
  

execution(<修饰符>? <返回类型> <包名>?<方法名>(<参数>)异常?)
execution(
    modifier-pattern?
    returnType-pattern
    package-pattern?
    methodName-pattern(args-pattern)
    throwException-pattern?
)
execution(*[修饰符]? *[返回值] *[包路径]?*[方法名](..[参数])throw *[异常类]?)

b.案例:
  1.修饰符匹配(modifier-pattern)(可选)

    //匹配所有public修饰的方法
    @Pointcut("execution(public * **(..))")
    public void exTest1(){}

  2.返回值匹配(returnType-pattern)

//匹配所有String或者void返回值的方法
    @Pointcut("execution(String||void **(..))")
    public void exTest2(){}

       3.包路径匹配(package-pattern)
  如果不使用..匹配到了类级别的名字,需要类.方法名………….
  

//com包下的所有类的方法
    @Pointcut("execution(* com.*.*(..))")
    public void exTest3(){}

    //如果不使用..匹配到了类级别的名字,需要类.方法名.............
    //com包下的所有子包的所有类的方法
    @Pointcut("execution(* com..*(..))")
    public void exTest4(){}

    //com包下的所有子包的ProductService类的方法
    @Pointcut("execution(* com..ProductService.*(..))")
    public void exTest5(){}

       4.方法名匹配(methodName-pattern)

//匹配所有test名字开头的方法
    @Pointcut("execution(* test*(..))")
    public void exTest6(){}

    //匹配所有包含test名字的方法
    @Pointcut("execution(* *test*(..))")
    public void exTest7(){}

       5.参数匹配(args-pattern)

//匹配所有参数列表的方法
    @Pointcut("execution(* *(..))")
    public void exTest8(){}

    //匹配无参数列表的方法
    @Pointcut("execution(* *())")
    public void exTest9(){}

       6.异常匹配(throwsException-pattern)

    //匹配所有抛过异常的方法
    @Pointcut("execution(* *()throws *)")
    public void exTest10(){}

    //只匹配所有抛出空指针异常的方法
    @Pointcut("execution(* *()throws NullPointerException)")
    public void exTest11(){}

2.匹配注解(使用了能被继承的注解的类,其子类也会被匹配):
  ◆@annotation():方法注解匹配

//方法注解匹配,匹配所有带AspectAnnotation注解的方法
    @Pointcut("@annotation(com.tiglle.manage.annotation.AspectAnnotation)")
    public void test(){
    }

  ◆@target():类注解匹

//匹配所有使用了AspectAnnotation注解的  类 的所有方法(要求注解的RetentionPolicy的级别为CLASS)
    @Pointcut("@within(com.tiglle.manage.AspectAnnotation)")
    public void withinMatch(){}

  ◆@arges():类注解匹配

//匹配所有使用了AspectAnnotation注解的  类 的所有方法(要求注解的RetentionPolicy的级别为RUNTIME)
    @Pointcut("@target(com.tiglle.manage.AspectAnnotation)")
    public void targetMatch(){}

  ◆@within():参数注解匹配

//匹配所有使用了AspectAnnotation注解的  参数 的方法
    @Pointcut("@args(com.tiglle.manage.AspectAnnotation)")
    public void argsMatch(){}

3.匹配包/类
  ◆within()
    1.如果传的是全类名(包名.类名):匹配此类下所有的方法
    

//匹配TestService类中的所有方法
@Pointcut("within(com.tiglle.service.TestService)")
public voud test(){}

    2.如果传的时包名:匹配此包下所有类的方法
    

//匹配com/tiglle/包下所有包和子包中的类中的所有方法
@Pointcut("within(com.tiglle..*)")
public voud test(){}

4.匹配对象
  ◆this():匹配代理对象(或普通类)和其子类

//匹配代理对象和普通对象及其所有子类的方法
    @Pointcut("this(com.tiglle.manage.service.ProductService)")
    public void thisMatch(){
    }

  ◆target():匹配原始对象(或普通类)和其子类

//匹配目标对象和普通对象及其所有子类的方法
    @Pointcut("target(com.tiglle.manage.service.ProductService)")
    public void targetMatch(){
    }

  ◆bean():根据bean的名称进行匹配

//根据spring容器的bean的名称(id)匹配,(不匹配子类)
    @Pointcut("bean(productService)")
    public void beanMatch(){
    }

5.匹配参数
  ◆args()
  1.匹配spring容器所有此参数类型和列表的方法(String,Long)

//匹配spring容器所有此参数类型和列表的方法(String,Long)
    @Pointcut("args(String,Long)")
    public void argsMatch(){}

2.匹配spring容器所有此参数类型和列表的方法(Long)

//匹配spring容器所有此参数类型和列表的方法(Long)
@Pointcut("args(Long)")
    public void argsMatch1(){}

3.匹配spring容器所有此参数类型和列表的方法(第一个为Long,后面随意)

//匹配spring容器所有此参数类型和列表的方法(第一个为Long,后面随意)
    @Pointcut("args(Long,..)")
    public void argsMatch2(){}

4./匹配spring容器所有此参数类型和列表的方法(前面随意,最后一个为Long)

//匹配spring容器所有此参数类型和列表的方法(前面随意,最后一个为Long)
    @Pointcut("args(..,Long)")
    public void argsMatch3(){}

5.匹配spring容器所有此参数类型和列表的方法(无参数列表)

//匹配spring容器所有此参数类型和列表的方法(无参数列表)
    @Pointcut("args()")
    public void argsMatch4(){}

6.匹配spring容器所有此参数类型和列表的方法(任意参数列表(包括无参数))

//匹配spring容器所有此参数类型和列表的方法(任意参数列表(包括无参数))
    @Pointcut("args(..)")
    public void argsMatch5(){}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值