举个栗子-SpringBoot-AOP的简单配置(复制可用)

  • SpringBoot-AOP
  • 1.在pom中添加maven依赖
  • 2.Spring配置注意(防坑)
  • 3.创建Controller(平时写代码的控制层 复制可用)
  • 4.创建AOP切面类(工具类或者配置类 复制可用)
  • 4.1.AOP切面注解说明
  • 5.测试运行


SpringBoot-AOP

我们知道Spring最核心的两个功能就是AOP(面向切面)和IOC(控制反转),那么现在我们就来看看在SpringBoot中 AOP的一个简单配置。

1.在pom中添加maven依赖

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2.Spring配置注意(防坑)

如果要直接用@Aspect注解的话,要在spring的配置文件中加入spring.aop.auto=true.
但是实际上,只要引入SpringAOP相关的jar包依赖,程序的主类中其实已经默认增加了@EnableAspectJAutoProxy。所以我们可以直接开始相关的Aspet的编程。

3.创建Controller(平时写代码的控制层 复制可用)

package ***;
import ****;

@Controller
@RequestMapping("/test")
public class testController {
  
    /**
     * 测试接口
     * @param
     * @param map
     * @return
     */
    @RequestMapping("/test1")
    @ResponseBody
    public String test1(){
        return  "test1";
    }
/**
     * 测试异常接口
     * @param
     * @param map
     * @return
     */
    @RequestMapping("/test2")
    @ResponseBody
    public Object test2(){
       return 1 / 0;
    }
    }

4.创建AOP切面类(工具类或者配置类 复制可用)

4.1.AOP切面注解说明

@Aspect 作用是把当前类标识为一个切面供容器读取
@Pointcut 定义切点,切点方法不用任何代码,返回值是void,重要的是条件表达式
@Before 标识一个前置增强方法,相当于BeforeAdvice的功能
@AfterReturning 后置增强,相当于AfterReturningAdvice,方法退出时执行
@AfterThrowing 异常抛出增强,相当于ThrowsAdvice
@After final 增强,不管是抛出异常或者正常退出都会执行
@Around 环绕增强,相当于MethodInterceptor

package ***;

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;

/**
 * LogAspect class
 * 切面
 * @author Timber_Li
 * @date 2020-7-14 15:10:12
 */
@Aspect
@Component
public class TestAspect {
	//此处写具体切点. 具体写法可以百度 路径一定要正确
    @Pointcut("execution(public * com.timber.controller.*.*(..))")
    public void testLog(){}

    @Before("testLog()")
    public void deBefore(JoinPoint joinPoint) throws Throwable {
        // 接收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        // 记录下请求内容  路径 ip 请求方法名  请求参数等等
        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()));

    }

    @AfterReturning(returning = "ret", pointcut = "testLog()")
    public void doAfterReturning(Object ret) throws Throwable {
        // 处理完请求,返回内容
        System.out.println("方法的返回值 : " + ret);
    }

    //后置异常通知
    @AfterThrowing("testLog()")
    public void throwss(JoinPoint jp){
        System.out.println("方法异常时执行.....");
    }

    //后置最终通知,final增强,不管是抛出异常或者正常退出都会执行
    @After("testLog()")
    public void after(JoinPoint jp){
        System.out.println("方法最后执行.....");
    }

    //环绕通知,环绕增强,相当于MethodInterceptor
    @Around("testLog()")
    public Object arround(ProceedingJoinPoint pjp) {
        System.out.println("方法环绕start.....");
        try {
            Object o =  pjp.proceed();
            System.out.println("方法环绕proceed,结果是 :" + o);
            return o;
        } catch (Throwable e) {
            e.printStackTrace();
            return null;
        }
    }
}

5.测试运行

正确接口 请求地址:http://localhost:8080/test/test1

控制台输出结果

方法环绕start.....
URL : http://localhost:8080/test/test1
HTTP_METHOD : POST
IP : 127.0.0.1
CLASS_METHOD : com.timber.controller.testController.test1
ARGS : []
方法环绕proceed,结果是 :test1
方法最后执行.....
方法的返回值 : test1

异常接口 请求地址:http://localhost:8080/test/test2

控制台输出结果

方法环绕start.....
URL : http://localhost:8080/test/test2
HTTP_METHOD : POST
IP : 127.0.0.1
CLASS_METHOD : com.timber.controller.testController.test2
ARGS : []
java.lang.ArithmeticException: / by zero

...具体异常代码...

方法最后执行.....
方法的返回值 : null

好啦 以上就是一个简单的AOP的例子 我们知道了AOP的执行顺序 以及注解的具体意思,那么就可以根据自己的具体需求去做切面处理啦!