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中通知方式:
-
前置通知[Before advice]:
在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。
-
正常返回通知[After returning advice]:
在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。
-
异常返回通知[After throwing advice]:
在连接点抛出异常后执行。
-
返回通知[After (finally) advice]:
在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。
-
环绕通知[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