AOP容器面向切面编程(动态代理)

发布于:2024-04-22 ⋅ 阅读:(158) ⋅ 点赞:(0)

aop面向切面编程

动态代理方式进行

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

面向特定的方法进行编程
统计方法的执行耗时,要执行的是哪个方法的执行耗时呢?
c

om.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 {
}