aop面向切面编程
动态代理方式进行
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
面向特定的方法进行编程
统计方法的执行耗时,要执行的是哪个方法的执行耗时呢?
com.zhurenjin.mybaties.control这个包下所有的接口,或者方法下的所有方法时候:
package com.zhurenjin.mybaties.aop;/*
*
* @Auther:ZHURENJIN
@version: 1.0
@Date: 2024 - 04 - 2024/4/19 -14:24
@Description:com.zhurenjin.mybaties.aop
* */
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@Aspect
public class timeAspect {
// 面向特定的方法进行编程
// 统计方法的执行耗时,要执行的是哪个方法的执行耗时呢?
// com.zhurenjin.mybaties.control这个包下所有的接口,或者方法下的所有方法时候:
@Around("execution(* com.zhurenjin.mybaties.*.*(..))") // 切入点表达式
public Object getControlExcuse(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object proceed = proceedingJoinPoint.proceed();// 原始的方法!,必须返回回去
Signature signature = proceedingJoinPoint.getSignature();
log.info("执行的参数时间signature={}",signature);
long end = System.currentTimeMillis();
long startEnd = end - start;
log.info("执行的方法返回值proceed={}",proceed);
// signature=List com.zhurenjin.mybaties.service.impl.userServiceimpl.list()
log.info("方法执行的参数时间耗时startEnd={},signature={}",startEnd,signature);
return proceed;
}
}
@Around("execution(* com.zhurenjin.mybaties.*.*(..))") // 切入点表达式
pointCut,
proceedingJoinPoint:可以被aop控制的切点,可以获取当前调用的方法;
@Around:环绕通知,此注解标注的通知方法在目标方法前、后都被执行 @Before:前置通知,此注解标注的通知方法在目标方法前被执行 @After :后置通知,此注解标注的通知方法在目标方法后被执行,无论是否有异常都会执行 @AfterReturning: 返回后通知,此注解标注的通知方法在目标方法后被执行,有异常不会执行 @AfterThrowing :异常后通知,此注解标注的通知方法发生异常后执行通配符..指的的任意的(任意)
*指的是单个(任意),请不要混淆
切入点表达式:
execution(“.....”)
@annonation(“.....”)//注解
仔细看清楚哦
综合案列
日志信息包含:操作人、操作时间、执行方法的全类名、执行方法名、方法运行时参数、返回值、方法执行时长 * 需要对所有业务类中的增、删、改方法添加统一功能,使用AOP 技术最为方便
package com.zhurenjin.mybaties.aop;/*
*
* @Auther:ZHURENJIN
@version: 1.0
@Date: 2024 - 04 - 2024/4/22 -11:59
@Description:com.zhurenjin.mybaties.aop
* */
import com.zhurenjin.mybaties.pojo.deptLog;
import com.zhurenjin.mybaties.service.deptLogService;
import com.zhurenjin.mybaties.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.Date;
/*
* 日志信息包含:操作人、操作时间、执行方法的全类名、执行方法名、方法运行时参数、返回值、方法执行时长
* 需要对所有业务类中的增、删、改方法添加统一功能,使用AOP 技术最为方便
* */
@Slf4j
@Component
@Aspect
public class LogAspect {
@Autowired
private HttpServletRequest request;
@Autowired
private deptLogService deptLogService;
@Pointcut("execution(* com.zhurenjin.mybaties.control..*(..))")
public void getExcute(){};
@Pointcut("@annotation(com.zhurenjin.mybaties.aop.operateLog)")
public void getExcuteNonation(){};
// @After("execution(* com.zhurenjin.mybaties..*(..))")
//@After("getExcute()")
// 增、删、改查才起作用的
@After("getExcuteNonation()")
public void afterMethodsExcute(JoinPoint joinPoint){
System.out.println("所有的*好后边走触发这个方法的集合?");
String token = request.getHeader("token");
Claims claims = JwtUtils.checkToken(token);
Object userId = claims.get("user_id");
System.out.println(userId+"---->>.user_id");
String methodName = joinPoint.getSignature().getName();
String className = joinPoint.getTarget().getClass().getName();
String operation = "Operation performed by user"; // 获取操作人,根据实际情况获取
Date operationTime = new Date();// 当前操作时间
LocalDateTime nowTime= LocalDateTime.now();
System.out.println("Operation: " + operation);
System.out.println("Operation Time: " + operationTime);
System.out.println("Method: " + className + "." + methodName);
/*
* 获取部门实体类
* */
deptLog deptLog = new deptLog();
deptLog.setCreate_time(nowTime);
deptLog.setDescription("类名文件路径"+className+":类执行的方法类名:"+methodName +"用户id+"+userId);
deptLogService.insert(deptLog);
}
}
package com.zhurenjin.mybaties.aop;/*
*
* @Auther:ZHURENJIN
@version: 1.0
@Date: 2024 - 04 - 2024/4/22 -15:25
@Description:com.zhurenjin.mybaties.aop
* */
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface operateLog {
}