整理的spring aop aspectj切入点语法 欢迎补充

  切入点指示符用来指示切入点表达式目的,,在spring aop中目前只有执行方法这一个连接点,spring aop支持的aspectj切入点指示符如下:。

  切入点指示符用来指示切入点表达式目的,,在spring aop中目只有执行方法这一个连接点,spring aop支持的aspectj切入点指示符如下:

  this:用于匹配当前aop代理对象类型的执行方法;注意是aop代理对象的类型匹配,这样就括引入接口也类型匹配;

  target:用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配;

  @target:用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解;

  bean:spring aop扩展的,aspectj没有对于指示符,用于匹配特定名称的bean对象的执行方法;

  只有@aspectj支持命名切入点,而schema格不支持命名切入点。

  ..:匹配任何量字符的重复,如在类型模式中匹配任何量子包;而在方法参数模式中匹配任何数量参数。

  匹配bean名称:可以使用bean的id或name进行匹配,并且可使用通配符*;

  在schema风格下,由于在xml中使用需要使用转义字符来代替之,所以很不方便,因spring asp 提供了and、or、not来代替、、!。

  date的方法,注意该匹配是根据方法签名的参数类型进行匹配的,而不是根据执行时传入的参数类型决定的

  任何带有一个参数的方法,且该参数类型持有@secure;

  任何带有一个参数(类型为secure注解;

  任何带有一个参数的方法,且传入的参数类型是有一个泛型参数,该泛型参数类型继承与hashmap;

  任何带有一个参数的方法,且传入的参数类型是有一个泛型参数,该泛型参数类型是hashmap的基类型;如public voi test(map map);

  任何带有一个参数的方法,且该参数类型是有一个泛型参数,该泛型参数类型上持有@secure注解;

  二、within:使用within(类型表达式)匹配指定类型的方法执行;

  三、this:使用this(类型全限定名)匹配当前aop代理对象类型的执行方法;注意是aop代理对象的类型匹配,这样就可能包括引入接口方法也可以匹配;注意this中使用的表达式必须是类型全限定名,不支持通配符;

  四、target:使用target(类型全限定名)匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配;注意target中使用的表达式必须是类型全限定名,不支持通配符;

  当前目标对象(非aop对象)实现了 ipointcutservice接口的任何方法

  五、args:使用args(参数类型列表)匹配当前执行的方法传入的参数为指定类型的执行方法;注意是匹配传入的参数类型,不是匹配方法签名的参数类型;参数类型列表中的参数必须是类型全限定名,通配符不支持;args属于动态切入点,这种切入点开销非常大,非特殊情况最好不要使用;

  任何一个以接受传入参数类型为serializable 开头,且其后可跟任意个任意类型的参数的方法执行,args指定的参数类型是在运行时动态匹配的

  六、@within:使用@within(注解类型)匹配所以持有指定注解类型内的方法;注解类型也必须是全限定类型名;

  七、@target:使用@target(注解类型)匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解;注解类型也必须是全限定类型名;

  八、@args:使用@args(注解列表)匹配当前执行的方法传入的参数持有指定注解的执行;注解类型也必须是全限定类型名;

  任何一个只接受一个参数的方法,且方法运行时传入的参数持有注解secure;动态切入点,类似于arg指示符;

  九、@annotation:使用@annotation(注解类型)匹配当前执行方法持有指定注解的方法;注解类型也必须是全限定类型名;

  十、bean:使用bean(bean id或名字通配符)匹配特定名称的bean对象的执行方法;spring asp扩展的,在aspectj中无应概念;

  十一、reference pointcut:表示引用其他命名切入点,只有@apectj风格支持,schema风格不支持,如下所示:

  除了可以在@aspectj风格的切面内引用外,也可以在schema风格的切面定义内引用,引用方式与@aspectj完全一样。

  到此我们切入点表达式语法示例就介绍完了,我们这些示例几乎包含了日常开发中的所有情况,当然还有更复杂的语法等等,如果以上介绍的不能满足您的需要,请参考aspectj文档。

  前边章节已经介绍了声明通知,但如果想获取被被通知方法参数并传递给通知方法,该如何实现呢?接下来我们将介绍两种获取通知参数的方式。

  1) joinpoint:提供访问当前被通知方法的目标对象、代理对象、方法参数等数据:

  3)staticpart:提供访问连接点的静态部分,如被通知方法签名、连接点类型等:

  使用如下方式在通知方法上声明,必须是在第一个参数,然后使用getargs()就能获取到被通知方法参数:

  在spring aop中,除了execution和bean指示符不能传递参数给通知方法,其他指示符都可以将匹配的相应参数或对象自动传递给通知方法。

  string;如果匹配将把该被通知参数传递给通知方法上同名参数。

  其他指示符(除了execution和bean指示符)都可以使用这种方式进行参数绑定。

  在此有一个问题,即前边<2构造器注入】中的参数名注入限制:在class文件中没生成变量调试信息是获取不到方法参数名字的。

  aop:pointcut:用来定义切入点,该切入点可以重用;

  aop:advisor:用来定义只有一个通知和一个切入点的切面;

  aop:aspect:用来定义切面,该切面可以包含多个切入点和通知,而且标签内部的通知和切入点定义是无序的;和advisor的区别就在此,advisor只包含一个通知和一个切入点。

  我说的是spring aop目前支持的语法(你看看文档上有说我这些吗),aspectj的有很多spring目前不支持啊。