栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot中使用AOP

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot中使用AOP

SpringBoot中使用AOP
  • maven依赖
  • 示例

AOP是通过动态代理实现的,动态代理又分为两个部分:JDK动态代理 和 CGLIB动态代理,以下两点需要记住:

1、AOP基于动态代理模式。
2、AOP是 方法级别 的。即,在方法执行的前,后,执行过程中,报错,返回结果等等流程中进行特殊操作

maven依赖

         org.springframework.boot
         spring-boot-starter-aop
   

这里可以不用指定版本号, 在SpringBoot 的 parent 包里面有版本的控制。

示例
  1. 可以代理指定包中的方法 通过 execution 表达式
  2. 可以代理方法上加了注解的
import java.lang.annotation.*;


@Documented
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface MyAnnotation {

    String value() default "";

    String myValue() default "我是自定义注解";

}
import lombok.extern.slf4j.Slf4j;
import org.aopalliance.intercept.Joinpoint;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
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;


@Aspect
@Component
@Slf4j
public class MyAop {

    @Pointcut("@annotation(com.intellsite.business.util.MyAnnotation)")
    public void testMyAnnotationAspect() {}

    
    //@Before(value = "testMyAnnotationAspect()") // 注解无参数 写法
    @Before(value = "testMyAnnotationAspect() && @annotation(myAnnotation)") // 注解带参数 写法
    public void before(JoinPoint joinpoint,MyAnnotation myAnnotation) {
        log.info("AOP before 执行 ...: 参数类型 {},name:{}",joinpoint.getArgs(),joinpoint.getSignature().getName());

        log.info("before-value ==" + myAnnotation.value() + ", before-myValue == " + myAnnotation.myValue());

        // 接收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        // 记录请求内容
        System.out.println("URL : " + request.getRequestURL().toString());
        System.out.println("HTTP_METHOD : " + request.getMethod());
        System.out.println("IP : " + request.getRemoteAddr());
        System.out.println("CLASS_METHOD : " + joinpoint.getSignature().getDeclaringTypeName() + "." + joinpoint.getSignature().getName());
        System.out.println("ARGS : " + Arrays.toString(joinpoint.getArgs()));

    }

    
    @Around(value = "testMyAnnotationAspect() && @annotation(myAnnotation))")
    public Object around(ProceedingJoinPoint proceedingJoinPoint, MyAnnotation myAnnotation) {
        try {
            log.info("AOP around 开始... 执行方法 ... : [ {} ], 参数为: [ {} ]",proceedingJoinPoint.getSignature().getName(),proceedingJoinPoint.getArgs());

            log.info("自定义注解值 value: " + myAnnotation.value() + "myValue: " + myAnnotation.myValue());

            Object proceed = proceedingJoinPoint.proceed();

            log.info("AOP around 结束... 执行方法 ... : [ {} ], 参数为: [ {} ]",proceedingJoinPoint.getSignature().getName(),proceedingJoinPoint.getArgs());

            return proceed;

        }catch (Throwable throwable) {
            log.info("AOP around 执行错误... error :{}", throwable.getMessage());
            throwable.printStackTrace();
            return "执行around出错。。。";
        }


    }

    
    @After(value = "execution(* com.intellsite.business.controller.AnnotationController.*(..))")
    public void after(JoinPoint joinPoint) {
        log.info("AOP after 执行... : {}",joinPoint.toLongString());
    }

    
    @AfterReturning(value = "execution(* com.intellsite.business.controller.AnnotationController.getInfo(..)))",returning = "result")
    public void afterReturning(JoinPoint joinPoint,Object result) {
        log.info("AOP afterReturning 执行...  :返回结果:{}", result);
    }

    
    @AfterThrowing(value = "testMyAnnotationAspect()",throwing = "exception")
    public void afterThrowing(JoinPoint joinPoint, Throwable exception) {
        log.error("AOP afterThrowing 执行... , msg : {}", exception.getMessage());
        if (exception instanceof NullPointerException) {

            log.info("空指针异常");
        }
    }
}

  1. 没抛异常的顺序
    正常: around开始 --》 before 执行–》afterReturning 执行–》after 执行–》around结束
  2. 异常时执行顺序
    异常: around开始–》before 执行–》afterThrowing 执行–》after 执行–》around

原文: https://www.cnblogs.com/dw3306/p/9615197.html

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/827062.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号