zoukankan      html  css  js  c++  java
  • @Pointcut注解

    首先原文链接:https://my.oschina.net/u/2474629/blog/1083448

    总结的非常到位,借鉴一下。

    首先@Pointcut是把重用的切点表达式抽取出来。

      什么是切点表达式?顾名思义,切点表达式就是告诉切面类,通知方法在什么时候运行的 表达式,他能锁定出一个或者一种方法,或者说锁定了一个位置出来。

      所以,当我们有场景需要抽取出来切点表达式的时候,这种表达式必然是有共性的:被切方法在同一包下、或者被切方法修饰符权限相同(比如所有的public方法)等等。。。

      常见的@Pointcut()参数是execution(public int com.xxxx.xx.add(int,*))写到参数表里匹配任意一个参数:第一个是int类型,第二个任意类型。接下来就借鉴一下别人总结的,注解的参数中多种其他的表达方式构建切点表达式:

    execution表达式

    execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern)throws-pattern?)
    

    上面的就是execution表达式的格式,execution匹配的就是连接点(Joinpoint,一般是方法),看上面的表达式execution是固定的,方法的修饰符是可选的,返回类型是必须的,定义的全限类型也是可选的,名称是必须的,参数是必须的,这些都可以使用通配符。

    任何的public方法

    execution(public * *(..))
    

    以set开始的方法

    execution(* set*(..))
    

    定义在cn.freemethod.business.pack.Say接口中的方法

    execution(* cn.freemethod.business.pack.Say.*(..))
    

    任何cn.freemethod.business包中的方法

    execution(* cn.freemethod.business.*.*(..))
    

    任何定义在com.xyz.service包或者其子包中的方法

    execution(* cn.freemethod.business..*.*(..))
    

    其他表达式

    任何在com.xyz.service包中的方法

    within(com.xyz.service.*)
    

    任何定义在com.xyz.service包或者其子包中的方法

    within(com.xyz.service..*)
    

    任何实现了com.xyz.service.AccountService接口中的方法

    this(com.xyz.service.AccountService)
    

    任何目标对象实现了com.xyz.service.AccountService的方法

    target(com.xyz.service.AccountService)
    

    一般情况下代理类(Proxy)和目标类(Target)都实现了相同的接口,所以上面的2个基本是等效的。

    有且只有一个Serializable参数的方法

    args(java.io.Serializable)
    

    只要这个参数实现了java.io.Serializable接口就可以,不管是java.io.Serializable还是Integer,还是String都可以。

    目标(target)使用了@Transactional注解的方法

    @target(org.springframework.transaction.annotation.Transactional)
    

    目标类(target)如果有Transactional注解中的所有方法

    @within(org.springframework.transaction.annotation.Transactional)
    

    任何方法有Transactional注解的方法

    @annotation(org.springframework.transaction.annotation.Transactional)
    

    有且仅有一个参数并且参数上类型上有Transactional注解

    @args(org.springframework.transaction.annotation.Transactional)
    

    注意是参数类型上有Transactional注解,而不是方法的参数上有注解。

    bean的名字为tradeService中的方法

    bean(simpleSay)
    

    bean名字为simpleSay中的所有方法。

    bean名字能匹配

    bean(*Impl)
    

    bean名字匹配*Impl的bean中的所有方法。

    如有差错,请各位指正
  • 相关阅读:
    LOJ#3157. 「NOI2019」机器人 DP+拉格朗日插值
    BZOJ4832 [Lydsy2017年4月月赛]抵制克苏恩 记忆化搜索
    LazySysAdmin 靶机渗透
    zico2靶机渗透
    6_面向对象-下之关键字:static
    5_面向对象-中之单元测试方法、包装类的使用
    5_面向对象-中之Object类的使用
    5_面向对象-中之面向对象的特征三:多态性
    5_面向对象-中之子类对象实例化全过程
    5_面向对象-中之关键字:super
  • 原文地址:https://www.cnblogs.com/Timeouting-Study/p/15179264.html
Copyright © 2011-2022 走看看