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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/564131.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue前端框架如何调用天聚数行API?

Vue是一个业内优秀的前端解决方案&#xff0c;采用了最新流行的MVVM框架模式&#xff0c;深受web前端开发者的喜爱&#xff0c;在相关开发者社区也一直都是热门交流话题。那么&#xff0c;如何通过Vue调用天行数据的API接口呢&#xff0c;下面就具体给大家示例。 vue采用的是数…

【Interconnection Networks 互连网络】Flattened Butterfly 扁平蝶形拓扑

Flattened Butterfly 扁平蝶形拓扑 1. 传统蝶形网络 Butterfly Topology2. 扁平蝶形拓扑 Flattened Butterfly3.On-Chip Flattened Butterfly 扁平蝶形拓扑应用于片上网络 Flattened Butterfly 扁平蝶形拓扑 扁平蝶形拓扑是一种经济高效的拓扑&#xff0c;适用于高基数路由器…

护眼落地灯哪个牌子好?落地灯十大知名品牌

一款优异的落地灯不只有照明的作用&#xff0c;更有装修作用。只不过&#xff0c;市面上的落地灯产品很多&#xff0c;质量良莠不齐&#xff0c;很多人不知道怎么挑选是好。小编的主张是从品牌下手&#xff0c;挑选口碑上佳的品牌落地灯产品。若问护眼落地灯哪个牌子好&#xf…

【学习】人工智能在软件测试中的作用有哪些

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到各个领域&#xff0c;并发挥着不可或缺的作用。其中&#xff0c;在软件测试方面&#xff0c;AI的应用也愈发普遍。本文将探讨人工智能在软件测试领域的关键作用以及其带来的积极影响。 一、提升测…

0.5W 3KVDC 隔离单、双输出 DC/DC 电源模块——TPV-W5 3.3V, 5V,12V 15V系列

TPV-W5系列提供正负双输出和单输出&#xff0c;工业级环境温度&#xff0c;用于PCB安装的国际标准结构。此系列产品小巧&#xff0c;效率高&#xff0c;低输出纹波及能承受3000V以上的耐压&#xff0c;用于需要正负电压或单输出和高隔离电压的场合。封装有SIP和DIP可选。

三、SpringBoot整合MyBatis

本章节主要描述MyBatis的整合&#xff0c;以及使用mybatis-generator-maven-plugin生成代码骨架&#xff0c;源码&#xff1a; jun/learn-springboot - Gitee.com 一、首先建数据库 本示例用的是MySQL8.0.23&#xff0c;建表t_goods、t_orders&#xff0c;略... 二、goods模块…

李廉洋:4.22现货黄金,WTI原油晚间行情走势分析及策略。

今年&#xff0c;全球金融市场正遭遇一股他们未曾预料到的力量&#xff1a;强势美元卷土重来&#xff0c;而且似乎将持续下去。根据美国商品期货交易委员会(CFTC)的数据&#xff0c;一项衡量交易员情绪的流行指标在今年年初指向看跌&#xff0c;但现在已转变为2019年以来最看涨…

模板建站的优缺点

模板建站是一种快速建立网站的方式&#xff0c;它可以通过使用预先设计好的页面模板&#xff0c;快速搭建出一个具有基本功能的网站&#xff0c;而无需手动编写网站代码。 模板建站具有以下优缺点。 优点&#xff1a; 1.快速建站&#xff1a;采用模板建站技术&#xff0c;可以…

使用yum安装pt-query-digest 并分析MySQL慢查询日志

查看慢SQL日志 1、查看慢日志设置 show variables like slow_query_log%; 2、设置慢日志开关 -- 关闭 SET GLOBAL slow_query_log OFF; -- 开启 SET GLOBAL slow_query_log ON; 3、查看慢日志阈值&#xff0c;即SQL执行时间超过阈值后&#xff0c;才会记录在慢日志文件中 …

光学雨量计雨量传感器在气象监测中的重要作用

光学雨量计雨量传感器在气象监测中的重要作用 光学雨量计是一种使用光学原理测量降水量的雨量传感器&#xff0c;它在气象监测中起到了重要的作用。本文将从原理、优势和应用等方面阐述光学雨量计的重要性。 河北稳控科技光学雨量计是利用光的传播和散射特性实现降水量测量的…

docker容器技术篇:centos7搭建docker swarm集群

centos7搭建docker swarm集群 一 docker swarm 概述 1.1 swarm简介 Docker Swarm是 Docker 的集群管理工具&#xff0c;Swarm 在 Docker 1.12 版本之前属于一个独立的项目&#xff1b;其主要作用是把Docker集群抽象为一个整体&#xff0c;并且通过一个统一管理这些 Docker 主…

ST05:根据跟踪记录表字段的变化判断所属的透明表及字段

ST05&#xff1a;根据跟踪记录表字段的变化判断所属的透明表及字段

IDEA更换新版本启动没反应

目前安装了新的IDEA(压缩包方式)&#xff0c;由于老版本的IDEA还在用&#xff0c;所以并没有删除&#xff0c;但是安装完后发现点击idea64.exe后没有反应&#xff0c;于是网上找了好多方法最后解决了 下面是我的解决过程 新版本&#xff1a;IntelliJIdea2024.1 老版本: Intelli…

C#语法知识之条件分支语句

4、条件分支语句 目录 4、条件分支语句1、条件分支语句 if1、作用2、if语句3、if...else语句4、if...else if...else语句思考1 只需要0~9数字思考2 语句块 2、条件分支语句 switch1、作用2、基本语法3、default可省略4、自定义常量5、贯穿 1、条件分支语句 if 1、作用 //让顺…

【MySQL篇】mysqlpump和mysqldump参数区别总汇(第三篇,总共四篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&am…

JavaEE初阶——多线程(七)——定时器

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享多线程的第七篇文章——关于定时器 如果有不足的或者错误的请您指出! 目录 4.定时器4.1标准库提供的定时器4.2自己实现一个定时器4.2.1任务类4.2.2Timer类4.2.3 有一个线程来负…

羊大师解析,喝羊奶是热天喝还是凉天喝好?

羊大师解析&#xff0c;喝羊奶是热天喝还是凉天喝好&#xff1f; 在夏季&#xff0c;无论是热天还是相对凉爽的日子&#xff0c;适量喝羊奶都是有益的。羊奶的营养价值并不会因为天气温度的高低而有所改变&#xff0c;它始终是一个优质的蛋白质、矿物质和维生素来源。 然而&am…

【黑马点评Redis——002商户查询缓存】

1. 商户查询缓存 2. 知识储备和课程内容 2.1 什么是缓存 缓存是数据交换的缓冲区&#xff0c;是存贮数据的临时地方&#xff0c;一般读写性能较高。 浏览器缓存应用层缓存数据库缓存CPU缓存磁盘缓存 缓存的作用&#xff1a; 降低后端负载提高读写效率&#xff0c;降低响应…

鸿蒙开发实例:【配置OpenHarmony SDK】

配置OpenHarmony SDK 在设置OpenHarmony应用开发环境时&#xff0c;需要开发者在DevEco Studio中配置对应的SDK信息。 说明&#xff1a; 请注意&#xff0c;OpenHarmony SDK版本精简了部分工具链&#xff0c;因此不适用于HarmonyOS应用开发。 前提条件 已下载并安装好DevEco …

上位机图像处理和嵌入式模块部署(树莓派4b使用pcl点云库)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 图像处理&#xff0c;大家都知道它有显著的优点和缺点。优点就是分辨率高&#xff0c;信息丰富。缺点就是&#xff0c;整个图像本身没有深度信息。…