SpringAOP中@Pointcut的⽤法
格式:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)
括号中各个pattern分别表⽰:
修饰符匹配(modifier-pattern?)
返回值匹配(ret-type-pattern)可以为*表⽰任何返回值,全路径的类名等
类路径匹配(declaring-type-pattern?)
⽅法名匹配(name-pattern)可以指定⽅法名或者 *代表所有, set* 代表以set开头的所有⽅法
参数匹配((param-pattern))可以指定具体的参数类型,多个参数间⽤“,”隔开,各个参数也可以⽤“*”来表⽰匹配任意类型的参数,如(String)表⽰匹配⼀个String参数的⽅法;(*,String) 表⽰匹配有两个参数的⽅法,第⼀个参数可以是任意类型,⽽第⼆个参数是String类型;可以⽤(..)表⽰零个或多个任意参数
异常类型匹配(throws-pattern?)
其中后⾯跟着“?”的是可选项
现在来看看⼏个例⼦:
1)execution(* *(..))
//表⽰匹配所有⽅法
2)execution(public * com. savage.service.UserService.*(..))
//表⽰匹配com.savage.server.UserService中所有的公有⽅法
3)execution(* com.savage.server..*.*(..))
//表⽰匹配com.savage.server包及其⼦包下的所有⽅法
在Spring 2.0中,Pointcut的定义包括两个部分:Pointcut表⽰式(expression)和Pointcut签名(signature)
//Pointcut表⽰式
@Pointcut("execution(* com.savage.aop.MessageSender.*(..))")
//Point签名
private void log(){}
然后要使⽤所定义的Pointcut时,可以指定Pointcut签名
如下:
@Before("og()")
这种使⽤⽅式等同于以下⽅式,直接定义execution表达式使⽤
@Before("execution(* com.savage.aop.MessageSender.*(..))")
Pointcut定义时,还可以使⽤&&、||、! 这三个运算
@Pointcut("execution(* com.savage.aop.MessageSender.*(..))")
private void logSender(){}
@Pointcut("execution(* com.savage.aop.MessageReceiver.*(..))")
private void logReceiver(){}
@Pointcut("logSender() || logReceiver()")
springboot实现aopprivate void logMessage(){}
这个例⼦中,logMessage()将匹配任何MessageSender和MessageReceiver中的任何⽅法。
还可以将⼀些公⽤的Pointcut放到⼀个类中,以供整个应⽤程序使⽤,如下:
package com.savage.aop;
import org.aspectj.lang.annotation.*;
public class Pointcuts {
@Pointcut("execution(* *Message(..))")
public void logMessage(){}
@Pointcut("execution(* *Attachment(..))")
public void logAttachment(){}
@Pointcut("execution(* *Service.*(..))")
public void auth(){}
}
在使⽤上⾯定义Pointcut时,指定完整的类名加上Pointcut签名就可以了,如:
package com.savage.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
@Aspect
public class LogBeforeAdvice {
@Before("com.sagage.aop.Pointcuts.logMessage()")
public void before(JoinPoint joinPoint) {
System.out.println("Logging before " + Signature().getName());
}
}
当基于XML Sechma实现Advice时,如果Pointcut需要被重⽤,可以使⽤<aop:pointcut></aop:pointcut>来声明Pointcut,然后在需要使⽤这个Pointcut的地⽅,⽤pointcut-ref引⽤就⾏了,如:
<aop:config>
  <aop:pointcut id="log" expression="execution(* com.savage.simplespring.bean.MessageSender.*(..))"/>
  <aop:aspect id="logging" ref="logBeforeAdvice">
    <aop:before pointcut-ref="log" method="before"/>
    <aop:after-returning pointcut-ref="log" method="afterReturning"/>
  </aop:aspect>
</aop:config>
另外,除了execution表⽰式外,还有within、this、target、args等Pointcut表⽰式

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。