Spring AOP execution

来源:互联网 发布:网络女主播换衣服视频 编辑:程序博客网 时间:2024/06/06 00:31
        ---1. 看括号里的小括号,代表参数类型和数量。对应JoinPoint.getArgs()
expression="execution(* *())",所有包的所有方法的无参数,调用切面。这里特别注意aop默认是通过接口调用实行类的方式。如果注入的的不是接口,需要导入cglib-nodep-2.1_3架包直接控制普通类。
[system log] :objective class:class dao.impl.A4Page  method:String dao.Page.getContext()parameter list:[]

expression="execution(* *(String))",所有包的所有方法的一个String参数
[system log] :objective class:class dao.impl.A4Page  method:void dao.Page.charAtPage(String)parameter list:[Plan the review plan]

expression="execution(* *(int,int,int))",所有包的所有方法的三个int参数
[system log] :objective class:class dao.impl.ColorInk  method:void dao.Ink.getColor(int,int,int)parameter list:[5, 5, 5]

expression="execution(* *(..))" ,所有包的所有方法任意参数任意类型
expression="execution(* *(*))",一个任意参数

        ---2.看括号前面一定是方法名字对应JoinPoint.getSignature()
expression="execution(* ch*(..))" ,以ch开头的所有方法
[system log] :objective class:class dao.impl.A4Page  method:void dao.Page.charAtPage(String)
    
expression="execution(* *(..))" ,任意开头


    ---3.如果是三个参数,就一定是返回类型
expression="execution(void *(..))" ,任意void方法
[system log] :objective class:dao.impl.ColorInk  method:void dao.Ink.getColor(int,int,int)parameter list:[5, 5, 5]

expression="execution(String *(..))"    ,返回String的方法
[system log] :objective class:biz.Print  method:String biz.Print.returnTest()parameter list:[]
    
    ---4.如果是四个参数,并且第一个是访问修饰符
     execution(public * *(..)),任意公共方法
    
     ---5.看括号前面如果有包名会和方法参数结合JoinPoint.getTarger().getClass()
expression="execution(* dao.impl.A4Page.*(..))",dao.impl.A4Page类下,所有方法
[system log] :objective class:dao.impl.A4Page  method:void dao.Page.charAtPage(String)parameter    

expression="execution(* dao.impl.A4Page.get*(..))",dao.impl.A4Page类下get开头方法
[system log] :objective class:dao.impl.A4Page  method:String dao.Page.getContext()parameter

expression="execution(* dao.impl..*.get*(..))" ,dao.impl下所有类get开头方法
[system log] :objective class:dao.impl.ColorInk  method:void dao.Ink.getColor(int,int,int)
    
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)

除了返回类型模式(上面代码片断中的ret-type-pattern),名字模式和参数模式以外,所有的部分都是可选的。 返回类型模式决定了方法的返回类型必须依次匹配一个连接点。 你会使用的最频繁的返回类型模式是 *,它代表了匹配任意的返回类型。 一个全称限定的类型名将只会匹配返回给定类型的方法。名字模式匹配的是方法名。 你可以使用 * 通配符作为所有或者部分命名模式。 参数模式稍微有点复杂:() 匹配了一个不接受任何参数的方法, 而 (..) 匹配了一个接受任意数量参数的方法(零或者更多)。 模式 (*) 匹配了一个接受一个任何类型的参数的方法。 模式 (*,String) 匹配了一个接受两个参数的方法,第一个可以是任意类型,第二个则必须是String类型。 请参见AspectJ编程指南的 Language Semantics 部分。

下面给出一些常见切入点表达式的例子。

    *

      任意公共方法的执行:

      execution(public * *(..))

    *

      任何一个以“set”开始的方法的执行:

      execution(* set*(..))

    *

      AccountService 接口的任意方法的执行:

      execution(* com.xyz.service.AccountService.*(..))

    *

      定义在service包里的任意方法的执行:

      execution(* com.xyz.service.*.*(..))

    *

      定义在service包或者子包里的任意方法的执行:

      execution(* com.xyz.service..*.*(..))

    *

      在service包里的任意连接点(在Spring AOP中只是方法执行) :

      within(com.xyz.service.*)

    *

      在service包或者子包里的任意连接点(在Spring AOP中只是方法执行) :

      within(com.xyz.service..*)

    *

      实现了 AccountService 接口的代理对象的任意连接点(在Spring AOP中只是方法执行) :

      this(com.xyz.service.AccountService)

      'this'在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得代理对象可以在通知体内访问到的部分。
    *

      实现了 AccountService 接口的目标对象的任意连接点(在Spring AOP中只是方法执行) :

      target(com.xyz.service.AccountService)

      'target'在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得目标对象可以在通知体内访问到的部分。
    *

      任何一个只接受一个参数,且在运行时传入的参数实现了 Serializable 接口的连接点 (在Spring AOP中只是方法执行)

      args(java.io.Serializable)

      'args'在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得方法参数可以在通知体内访问到的部分。

      请注意在例子中给出的切入点不同于 execution(* *(java.io.Serializable)): args只有在动态运行时候传入参数是可序列化的(Serializable)才匹配,而execution 在传入参数的签名声明的类型实现了 Serializable 接口时候匹配。
    *

      有一个 @Transactional 注解的目标对象中的任意连接点(在Spring AOP中只是方法执行)

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

      '@target' 也可以在binding form中使用:请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。
    *

      任何一个目标对象声明的类型有一个 @Transactional 注解的连接点(在Spring AOP中只是方法执行)

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

      '@within'也可以在binding form中使用:- 请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。
    *

      任何一个执行的方法有一个 @Transactional annotation的连接点(在Spring AOP中只是方法执行)

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

      '@annotation' 也可以在binding form中使用:- 请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。
    *

      任何一个接受一个参数,并且传入的参数在运行时的类型实现了 @Classified annotation的连接点(在Spring AOP中只是方法执行)

      @args(com.xyz.security.Classified)

      '@args'也可以在binding form中使用:- 请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。

      ================================================

      出现error at ::0 can't find referenced pointcut...这样的错误原因是:如果你用的JDK版本是1.6的话,而引用的aspectjrt.jar是spring-2.0中包含的jar包的情况下就会报这样的错误。
      解决的办法就是下载最新的aspectjrt的jar包即可aspectj-1.6.6.jar
原创粉丝点击