(spring boot)使用AOP切面实现日志的注入
在此之前需要引入相应的依赖(spring aop)
org.springframework.boot
spring-boot-starter-aop
注解说明
@Aspect:作用是把当前类标识为一个切面供容器读取
前置通知(@Before):在目标方法被调用之前调用通知功能。
后置通知(@After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么。
返回通知(@After-returning):在目标方法成功执行之后调用通知。
异常通知(@After-throwing):在目标方法抛出异常后调用通知。
环绕通知(@Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
execution切点函数
通过方法签名定义切点
execution(public * (..)) 匹配所有目标类的public方法。 第一个代表返回类型,第二个*代表方法名,而..代表任意入参的方法
execution(* To(..)) 匹配目标类所有以To为后缀的方法。 第一个代表返回类型,而*To代表任意以To为后缀的方法。
连接点(Joinpoint)
程序执行的某个特定位置(如:某个方法调用前、调用后,方法抛出异常后)。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就是连接点。Spring仅支持方法的连接点
实现切面注入日志类
package *.*.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import *.LoggerHelper;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggingAspect {
@Pointcut("execution(public * com.api.XXXApi.*(..))")//切入点描述 这个是api包的切入点(注入需要监听的API)
public void apiLog(){
//可以理解成这个切入点的一个名称
}
@Before("apiLog()") //在切入点的方法运行之前要执行的方法(通过注解实现)
public void doBeforeApi(JoinPoint joinPoint) {
LoggerHelper.info("方法:"+joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName() +"开始执行时间==》"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
@After("apiLog()") //在切入点的方法运行之前要做的
public void DoBfterApi(JoinPoint joinPoint) {
LoggerHelper.info("方法:"+joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()+"结束时间==》"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}