springboot整合AOP记录用户操作

本次示例是使用springboot版本:2.2.6.RELEASE 数据库使用:Mysql  ,通过aop记录用户访问记录。

目录

一、引入依赖

二、创建controller模拟请求

三、定义切面类,实现web层的日志切面

四、测试结果


一、引入依赖

只需引入以下依赖即可,我看关系图可以看出,在data中含有aop的包。因此不需要另外再引入aop的依赖。

        <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

二、创建controller模拟请求

  @RequestMapping(value = "/test",method =RequestMethod.GET )
    public String welcome(String id,String name){
        System.out.println("Crud Spring Boot Project ! "+"参数:"+id+","+name);
        return "Crud Spring Boot Project ! ";
    }

三、定义切面类,实现web层的日志切面

 @Component 注解可以把切面类加入到IOC容器中

@Aspect 注解可以使之成为切面类

通过JoinPoint可以获得通知的签名信息,如目标方法名、目标方法参数信息等;

通过RequestContextHolder来获取请求信息,Session信息;

package com.springboot.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


@Aspect
@Component
public class OperateRescordAspect {


    @Pointcut("execution(public * com.springboot.controller.UserController.*(..))")
    public void pintCut(){}

    /**
     * 前置通知:方法执行前拦截到
     * @param point
     */
    @Before("pintCut()")
    public void before(JoinPoint point){
        String methodName = point.getSignature().getName();
        Object [] params = point.getArgs();
        List< Object> list = new ArrayList<Object>(params.length);
        Collections.addAll(list,params);
        System.out.println("前置通知--方法名:"+methodName+",参数:"+list);
    }

    /**
     * 环绕通知
     * @param point
     */
    //@Around(value = "execution(public * com.springboot.controller.UserController.*(..))")
   // @Around("pintCut()")
    public void around(JoinPoint point){
        System.out.println("环绕通知");
    }

    /**
     * 后置通知:当目标方法执行完之后,不管抛不抛异常都会走此方法
     * @param point
     */
    //@After(value = "execution(public * com.springboot.controller.UserController.*(..))")
    //@After("pintCut()")
    public void after(JoinPoint point){
        System.out.println("后置通知");

    }

    /**
     * 返回通知:当方法正常执行通过之后执行
     * @param point
     * @param result 返回值
     */
    //@AfterReturning(value="execution(public * com.springboot.controller.UserController.*(..))",returning="result")
    //@AfterReturning(returning = "result",pointcut = "pintCut()")
    public void afterReturning(JoinPoint point, Object result){
        System.out.println("返回通知"+",返回结果:"+result);

    }

    /**
     * 异常通知:当目标方法非正常执行完成、发生异常、抛出异常的时候会走此方法
     */
    //@AfterThrowing(value="execution(public * com.springboot.controller.UserController.*(..))",throwing="e")
    @AfterThrowing(pointcut = "pintCut()",throwing="e")
    public void afterThrowing(JoinPoint joinPoint, Exception e){
        System.out.println("异常通知,"+"异常信息:"+e);
    }

}

四、测试结果

通过访问:http://localhost:8080/userController/test?id=345&name=hahha 可以在控制台打印以下内容

猜你喜欢

转载自blog.csdn.net/weixin_42228950/article/details/105325944