Spring Boot系列(三)使用AOP统一记录日志

AOP为Aspect Oriented Programming的缩写,意为面向切面编程。它是Spring两大核心之一,在Spring中AOP的实现可以通过jdk动态代理和CGLib代理两种方式实现。AOP的出现使得我们在开发过程中将系统关注点(日志记录,安全,事务等等)和实际业务逻辑分离开来,减少了各模块之间的耦合度,以及增加了代码的可重用性和灵活性,大大的简化了复杂应用的开发。好了,关于AOP的介绍就到这里,想深入了解的小伙伴可以自行查阅资料。下面来说说springboot如何使用AOP统一记录日志:

  1. 新建一个SpringBoot项目,然后建一个TestController类,LogAspect类以及日志记录工具类LogUtil,如下:
@RestController
@RequestMapping(value="/test")
public class TestController {

   @GetMapping(value="/sayHello")
   public String sayHello(){
   	LogUtil.log().info("sayHello()方法执行了...");
   	return "success";
   }
   
}
@Aspect
@Component
public class LogAspect {

	@Before("execution(public * com.instamina.springboot.controller.TestController.*(..))")
	public void before() {
		LogUtil.log().info("方法执行前。。。");
	}
	@After("execution(public * com.instamina.springboot.controller.TestController.*(..))")
	public void after() {
		LogUtil.log().info("方法执行后。。。");
	}
}
public class LogUtil {
	private static final Logger log = LoggerFactory.getLogger(LogUtil.class);
	
	public static Logger log() {
		return log;
	}
}

这里TestController和LogUtil这两个类自不必多说。对于LogAspect类:

@Aspect注解声明这是一个切面
@Component注解实例化对象
类内定义了一个前置通知和一个后置通知,分别用@Before和@After声明,其值为切点表达式,表示需要增强的方法

  1. 启动项目,控制台打印如下信息则表式成功
    在这里插入图片描述

不知小伙伴们有没有觉得LogAspect类很别扭,同一个切表达式居然写了两遍,以后维护起来非常的麻烦,而且可读性也不好。对此我们可以把切点表达式抽取出来,如何抽取呢?使用@Pointcut注解声明一个切点即可,下面我们来对LogAspect类做一些改动

@Aspect
@Component
public class LogAspect {
	@Pointcut(value="execution(public * com.instamina.springboot.controller.TestController.*(..))")
	public void log() {
		
	}
	@Before("log()")
	public void before() {
		LogUtil.log().info("方法执行前。。。");
	}
	@After("log()")
	public void after() {
		LogUtil.log().info("方法执行后。。。");
	}
}

这样是不是清爽多了呢

你可能感兴趣的:(Spring Boot系列(三)使用AOP统一记录日志)