格式:
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(* *(..))
//表示匹配com.savage.server.UserService中所有的公有方法
2)execution(public * com. savage.service.UserService.*(..))
//表示匹配com.savage.server包及其子包下的所有方法
3)execution(* com.savage.server..*.*(..))
用法:
Pointcut的定义包括两个部分:Pointcut表示式(expression)和Pointcut签名(signature)
@Pointcut("execution(* com.savage.aop.MessageSender.*(..))") //Pointcut表示式
private void log(){} //Point签名
然后要使用所定义的Pointcut时,可以指定Pointcut签名
@Before("log()")
这种使用方式等同于以下方式,直接定义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()")
private void logMessage(){} //logMessage()将匹配任何MessageSender和MessageReceiver中的任何方法。
举例:
package com.github.pig.common.bean.aop;
import com.github.pig.common.constant.SecurityConstants;
import com.github.pig.common.util.UserUtils;
import com.xiaoleilu.hutool.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
@Slf4j
@Aspect
@Component
public class ControllerAop {
@Pointcut("execution(public com.github.pig.common.util.R *(..))")
public void pointCutR() {
}
/**
* 拦截器具体实现
*
* @param pjp 切点 所有返回对象R
* @return R 结果包装
*/
@Around("pointCutR()")
public Object methodRHandler(ProceedingJoinPoint pjp) throws Throwable {
return methodHandler(pjp);
}
@Pointcut("execution(public com.baomidou.mybatisplus.plugins.Page *(..))")
public void pointCutPage() {
}
/**
* 拦截器具体实现
*
* @param pjp 切点 所有返回对象Page
* @return R 结果包装
*/
@Around("pointCutPage()")
public Object methodPageHandler(ProceedingJoinPoint pjp) throws Throwable {
return methodHandler(pjp);
}
private Object methodHandler(ProceedingJoinPoint pjp) throws Throwable {
long startTime = System.currentTimeMillis();
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String username = request.getHeader(SecurityConstants.USER_HEADER);
if (StrUtil.isNotBlank(username)) {
log.info("Controller AOP get username:{}", username);
UserUtils.setUser(username);
}
log.info("URL : " + request.getRequestURL().toString());
log.info("HTTP_METHOD : " + request.getMethod());
log.info("IP : " + request.getRemoteAddr());
log.info("CLASS_METHOD : " + pjp.getSignature().getDeclaringTypeName() + "." + pjp.getSignature().getName());
log.info("ARGS : " + Arrays.toString(pjp.getArgs()));
Object result;
result = pjp.proceed();
log.info(pjp.getSignature() + "use time:" + (System.currentTimeMillis() - startTime));
if (StrUtil.isNotEmpty(username)) {
UserUtils.clearAllUserInfo();
}
return result;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/15999.html