Home Blog my Blog • spring之面向切面编程(AOP)PointCut匹配法则说明

spring之面向切面编程(AOP)PointCut匹配法则说明

 - 

Pointcut 是指那些方法需要被执行”AOP”,是由”Pointcut Expression”来描述的.
Pointcut可以有下列方式来定义或者通过&& || 和!的方式进行组合.
args()
@args()
execution()
this()
target()
@target()
within()
@within()
@annotation
其中execution 是用的最多的,其格式为:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)
returning type pattern,name pattern, and parameters pattern是必须的.
ret-type-pattern:可以为*表示任何返回值,全路径的类名等.
name-pattern:指定方法名,*代表所以,set*,代表以set开头的所有方法.
parameters pattern:指定方法参数(声明的类型),(..)代表所有参数,(*)代表一个参数,(*,String)代表第一个参数为任何值,第二个为String类型.
举例说明:
任意公共方法的执行:
execution(public * *(..))
任何一个以“set”开始的方法的执行:
execution(* set*(..))
AccountService 接口的任意方法的执行:
execution(* com.xyz.service.AccountService.*(..))
定义在service包里的任意方法的执行:
execution(* com.xyz.service.*.*(..))
定义在service包和所有子包里的任意类的任意方法的执行:
execution(* com.xyz.service..*.*(..))
定义在pointcutexp包和所有子包里的JoinPointObjP2类的任意方法的执行:
execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))”)
***> 最靠近(..)的为方法名,靠近.*(..))的为类名或者接口名,如上例的JoinPointObjP2.*(..))

pointcutexp包里的任意类.
within(com.test.spring.aop.pointcutexp.*)
pointcutexp包和所有子包里的任意类.
within(com.test.spring.aop.pointcutexp..*)
实现了Intf接口的所有类,如果Intf不是接口,限定Intf单个类.
this(com.test.spring.aop.pointcutexp.Intf)
***> 当一个实现了接口的类被AOP的时候,用getBean方法必须cast为接口类型,不能为该类的类型.

带有@Transactional标注的所有类的任意方法.
@within(org.springframework.transaction.annotation.Transactional)
@target(org.springframework.transaction.annotation.Transactional)
带有@Transactional标注的任意方法.
@annotation(org.springframework.transaction.annotation.Transactional)
***> @within和@target针对类的注解,@annotation是针对方法的注解

参数带有@Transactional标注的方法.
@args(org.springframework.transaction.annotation.Transactional)
参数为String类型(运行是决定)的方法.
args(String)
Pointcut 可以通过Java注解和XML两种方式配置,如下所示:

  1. <aop:config>
  2.     <aop:aspectrefaop:aspectref=”aspectDef”>
  3.         <aop:pointcutidaop:pointcutid=”pointcut1″expression=”execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))”/>
  4.         <aop:before pointcut-ref=”pointcut1″ method=”beforeAdvice” />
  5.     </aop:aspect>
  6. </aop:config>
  7. @Component
  8. @Aspect
  9. public class AspectDef {
  10.     //@Pointcut(“execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))”)
  11.     //@Pointcut(“within(com.test.spring.aop.pointcutexp..*)”)
  12.     //@Pointcut(“this(com.test.spring.aop.pointcutexp.Intf)”)
  13.     //@Pointcut(“target(com.test.spring.aop.pointcutexp.Intf)”)
  14.     //@Pointcut(“@within(org.springframework.transaction.annotation.Transactional)”)
  15.     //@Pointcut(“@annotation(org.springframework.transaction.annotation.Transactional)”)
  16.     @Pointcut(“args(String)”)
  17.     public void pointcut1() {
  18.     }
  19.     @Before(value = “pointcut1()”)
  20.     public void beforeAdvice() {
  21.         System.out.println(“pointcut1 @Before…”);
  22.     }

Author:Dong

36 responses to “spring之面向切面编程(AOP)PointCut匹配法则说明”

  • ubezpieczenia grupowe pracownicze 2013年5月3日 at 07:46 Reply 

    Greats comments and site.


    • Dong 2013年5月6日 at 09:56 Reply 

      thx a lot


      • Graceland 2017年3月4日 at 09:15 Reply 

        Your posting really stethgiarned me out. Thanks!


  • cheap Oakley Active 2013年5月5日 at 17:03 Reply 

    000 times!!!


    • Dong 2013年5月6日 at 09:57 Reply 

      what do u mean?


    • Keiffer 2017年3月4日 at 09:24 Reply 

      Thanks for the great info dog I owe you biygitg.


  • oakley holbrook 2013年5月7日 at 19:20 Reply 

    This is a great post. Thanks so much for sharing, like always.


  • whole foods toms shoes 2013年5月18日 at 19:34 Reply 

    I think this is one of the most vital information for me. And i’m glad reading your article. But wanna remark on few general things, The site style is wonderful, the articles is really nice : D. Good job, cheers


    • Dong 2013年5月21日 at 00:47 Reply 

      thx a lot


  • toms shoe store 2013年5月18日 at 22:07 Reply 

    It’s the best time to make some plans for the future and it’s time to be happy. I’ve read this post and if I could I desire to suggest you some interesting things or advice. Maybe you can write next articles referring to this article. I desire to read more things about it!


Leave a Reply

Your email address will not be published. Required fields are marked*

*

*