前置通知 ‹aop∶before›

Exisi 2022-11-28 08:30:44
Categories: Tags:


语法

<aop:before method="执行方法" pointcut="切入表达式" />

<aop:before method="执行方法" pointcut-ref="切入表达式id" />

 

参数

描述

method

在通知类中设置当前通知类别对应的方法

pointcut

设置当前通知对应的切入点表达式,不能同时使用pointcut-ref

pointcut-ref

设置当前通知对应的切入点id,不能同时使用pointcut

示例

<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>

 

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() 获取)等