point cut 配置使用

1.execution(方法修饰符 返回类型 方法全限定名(参数))         主要用来匹配整个方法签名和返回值的

"execution(public * com.xhx.springboot.controller.*.*(..))"
    *只能匹配一级路径  

    ..可以匹配多级,可以是包路径,也可以匹配多个参数

    + 只能放在类后面,表明本类及所有子类

   还可以按下面这么玩,所有get开头的,第一个参数是Long类型的

@Pointcut("execution(* *..get*(Long,..))")


  2. within(类路径)   用来限定类,同样可以使用匹配符

       下面用来表示com.xhx.springboot包及其子包下的所有类方法

"within(com.xhx.springboot..*)"
 

3. this与target

     this与target在用法上有些重合,理解上有对比性。

      this表示当前切入点表达式所指代的方法的对象的实例,即代理对象是否满足this类型

      target表示当前切入点表达式所指代的方法的目标对象的实例   即是否是为target类做的代理

    如果当前对象生成的代理对象符合this指定的类型,则进行切面,target是匹配业务对象为指定类型的类,则进行切面。

     生成代理对象时会有两种方法,一个是CGLIB一个是jdk动态代理。

      用下面三个例子进行说明:     

this(SomeInterface)或target(SomeInterface):这种情况下,无论是对于Jdk代理还是Cglib代理,其目标对象和代理对象都是实现SomeInterface接口的(Cglib生成的目标对象的子类也是实现了SomeInterface接口的),因而this和target语义都是符合的,此时这两个表达式的效果一样;
this(SomeObject)或target(SomeObject),这里SomeObject没实现任何接口:这种情况下,Spring会使用Cglib代理生成SomeObject的代理类对象,由于代理类是SomeObject的子类,子类的对象也是符合SomeObject类型的,因而this将会被匹配,而对于target,由于目标对象本身就是SomeObject类型,因而这两个表达式的效果一样;
this(SomeObject)或target(SomeObject),这里SomeObject实现了某个接口:对于这种情况,虽然表达式中指定的是一种具体的对象类型,但由于其实现了某个接口,因而Spring默认会使用Jdk代理为其生成代理对象,Jdk代理生成的代理对象与目标对象实现的是同一个接口,但代理对象与目标对象还是不同的对象,由于代理对象不是SomeObject类型的,因而此时是不符合this语义的,而由于目标对象就是SomeObject类型,因而target语义是符合的,此时this和target的效果就产生了区别;这里如果强制Spring使用Cglib代理,因而生成的代理对象都是SomeObject子类的对象,其是SomeObject类型的,因而this和target的语义都符合,其效果就是一致的。
 

  4.args(paramType)

       args无论其类路径或者是方法名是什么,表达式的作用是匹配指定参数类型和指定参数数量的方法,类型用全路径     

args(java.lang.String,..,java.lang.Integer)
  5.@within(annotationType) 匹配带有指定注解的类,,within为配置指定类型的类实例

       下面匹配含有 @Component注解的类

"@within(org.springframework.stereotype.Component)"


  6.@annotation(annotationType) 匹配带有指定注解的方法

 

  7.@args(annotationType)

            @args表示使用指定注解标注的类作为某个方法的参数时该方法将会被匹配

 

可以使用&&、||、!、三种运算符来组合切点表达式,表示与或非的关系。

@Around(value = "pointcut1() || pointcut2()")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值