其他分享
首页 > 其他分享> > 1.springboot整合AOP

1.springboot整合AOP

作者:互联网

1.导入AOP的依赖

 <!--springboot与aop集成jar包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

2.配置AOP切面拦截

在springboot中加入aop是不需要在启动类加任何注解的也不用创建config文件配置@EnableAspectJAutoProxy,因为在AOP的默认配置属性中,spring.aop.auto属性默认是开启的,也就是说只要引入了AOP依赖后,默认已经增加了@EnableAspectJAutoProxy。
2.1 、定义一个切面 需要需要声明这个切面@Aspect 然后用@Component 把切面放入spring中.
springAop的5中通知方式:

  1. 前置通知[Before advice]:

    在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。 
    
  2. 正常返回通知[After returning advice]:

    在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。 
    
  3. 异常返回通知[After throwing advice]:

    在连接点抛出异常后执行。 
    
  4. 返回通知[After (finally) advice]:

    在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。 
    
  5. 环绕通知[Around advice]:

    环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。 
    
package com.zrp.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
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;

/**
 * @author 赵锐鹏
 * @date 2021/11/2 0002
 */
@Aspect //配置切面
@Component
@Slf4j
public class NotVeryUsefulAspect {

    /**
     * (* com.zrp.service.*.*(..))
     * 第一个 * 代表所有的方法
     * 第二个 * 前面com.zrp.service.*下面的所有类 然后后面* 代表以及子类
     * 最后面括号里面的 .. 代表所有参数
     *
     * 定义切入点,切入点为com.example.aop下的所有函数
     */
    @Pointcut("execution(* com.zrp.service.*.*(..))")
    public void webLog() {
    }

    /**
     *  前置通知:在连接点之前执行的通知
     *
     *  注意:这里用到了JoinPoint和RequestContextHolder。
     * 1)、通过JoinPoint可以获得通知的签名信息,如目标方法名、目标方法参数信息等;
     * 2)、通过RequestContextHolder来获取请求信息,Session信息;
     */
    @Before("webLog()")
    public void before(JoinPoint joinPoint) {
        // 接收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        // 记录下请求内容
        log.info("URL : " + request.getRequestURL().toString());
        log.info("HTTP_METHOD : " + request.getMethod());
        log.info("IP : " + request.getRemoteAddr());
        log.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
        log.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));

        System.out.println("之前运行!");
    }

    @After("webLog()")
    public void after() {
        System.out.println("之后执行!");
    }

    @AfterThrowing("webLog()")
    public void beferException() {
        System.out.println("方法报错时运行");
    }

    @AfterReturning(returning = "ret",pointcut = "webLog()")
    public void afterEnd(Object ret) throws Throwable {
        // 处理完请求,返回内容(获取的是前面方法返回的结果)
        log.info("RESPONSE : " + ret);
        System.out.println("方法返回时候调用");
    }
}


标签:info,springboot,连接点,通知,整合,AOP,import,执行,public
来源: https://blog.csdn.net/qq_38092788/article/details/121095314