面向切面(AOP)Aspect Oriented Programming是一种编程范式,与语言无关,是一种程序设计思想,它也是spring的两大核心之一。不了解的可以看下慕课网的视频讲解。以下是个人学习视频后整理出来的关键代码。
添加Aop依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
创建一个处理文件,在类上添加@Aspect注解,再用@Component将类加入到spring容器中去
package com.xu.demo_springboot_01.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;//spring自带的日志框架
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
@Aspect
@Component//将这个类引入spring容器中去
public class HttpAspect {
private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class); //参数为当前使用的类名
@Pointcut("execution(public * com.xu.demo_springboot_01.controller.GirlController.*(..))") //要处理的方法,包名+类名+方法名
public void cut(){
}
@Before("cut()")//在调用上面 @Pointcut标注的方法前执行以下方法
public void doBefore(JoinPoint joinPoint){//用于获取类方法
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//url
logger.info("url ={}",request.getRequestURI());
//method
logger.info("method={}",request.getMethod());
//ip
logger.info("ip={}",request.getRemoteAddr());
//类方法
logger.info("class_method={}",joinPoint.getSignature().getDeclaringTypeName()+‘.‘+ joinPoint.getSignature().getName());//获取类名及类方法
//参数
logger.info("args={}",joinPoint.getArgs());
}
@After("cut()")//无论Controller中调用方法以何种方式结束,都会执行
public void doAfter(){
logger.info("----doAfter-----------");
}
@AfterReturning(returning = "obj",pointcut = "cut()")//在调用上面 @Pointcut标注的方法后执行。用于获取返回值
public void doAfterReturning(Object obj){
logger.info("response={}",obj.toString());
}
}
PS:导包要注意,导包要注意,导包要注意~
注:
//记录日志变量的方法
logger.info("url ={}",request.getRequestURI());//逗号后面跟要记录的变量
//记录日志常量
logger.info("url");