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

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

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神の愛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值