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 可以在控制台打印以下内容
还没有评论,来说两句吧...