- 原始方法执行前执行,如果通知中抛出异常,阻止原始方法运行
- 主要用于数据检验,信息的统计
语法
<aop:before method="执行方法" pointcut="切入表达式" />
<aop:before method="执行方法" pointcut-ref="切入表达式id" />
参数 |
描述 |
method |
在通知类中设置当前通知类别对应的方法 |
pointcut |
设置当前通知对应的切入点表达式,不能同时使用pointcut-ref |
pointcut-ref |
设置当前通知对应的切入点id,不能同时使用pointcut |
示例
- application.xml
<aop:aspect ref="adviceId">
<!--直接配置切入点-->
<aop:before method="doBefore" pointcut="execution(* com.exi.service.LogApectHandler.*.*(..))"/>
</aop:aspect>
<aop:pointcut id="pt" expression="execution(* com.exi.service.LogApectHandler.*.*(..))"/>
<aop:aspect ref="adviceId">
<!--使用公共切入点-->
<aop:before method="doBefore" pointcut-ref="pt"/>
</aop:aspect>
- LogAspectHandler.java
public class LogAspectHandler {
public void doBefore(JoinPoint joinPoint) {
log.info("====doBefore方法进入了====");
// 获取签名
Signature signature = joinPoint.getSignature();
// 获取切入的包名
String declaringTypeName = signature.getDeclaringTypeName();
// 获取即将执行的方法名
String funcName = signature.getName();
log.info("即将执行方法为: {},属于{}包", funcName, declaringTypeName);
// 也可以用来记录一些信息,比如获取请求的 URL 和 IP
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 获取请求 URL
String url = request.getRequestURL().toString();
// 获取请求 IP
String ip = request.getRemoteAddr();
log.info("用户请求的url为:{},ip地址为:{}", url, ip);
}
}
JointPoint 对象很有用,可以用它来获取一个签名,利用签名可以获取请求的包名、方法名,包括参数(通过 joinPoint.getArgs() 获取)等