【Spring【AOP】】——20、搭建一个AOP测试环境?

news2025/2/26 23:16:06

在这里插入图片描述

📫作者简介:zhz小白
公众号:小白的Java进阶之路
专业技能:
1、Java基础,并精通多线程的开发,熟悉JVM原理
2、熟悉Java基础,并精通多线程的开发,熟悉JVM原理,具备⼀定的线上调优经验
3、熟悉MySQL数据库调优,索引原理等,⽇志原理等,并且有出过⼀篇专栏
4、了解计算机⽹络,对TCP协议,滑动窗⼝原理等有⼀定了解
5、熟悉Spring,Spring MVC,Mybatis,阅读过部分Spring源码
6、熟悉SpringCloud Alibaba体系,阅读过Nacos,Sentinel,Seata,Dubbo,Feign,Gateway核⼼源码与设计,⼆次开发能⼒
7、熟悉消息队列(Kafka,RocketMQ)的原理与设计
8、熟悉分库分表ShardingSphere,具有真实⽣产的数据迁移经验
9、熟悉分布式缓存中间件Redis,对其的核⼼数据结构,部署架构,⾼并发问题解决⽅案有⼀定的积累
10、熟悉常⽤设计模式,并运⽤于实践⼯作中
11、了解ElasticSearch,对其核⼼的原理有⼀定的了解
12、了解K8s,Jekins,GitLab
13、了解VUE,GO
14、⽬前有正在利⽤闲暇时间做互游游戏,开发、运维、运营、推销等

本人著作git项目:https://gitee.com/zhouzhz/star-jersey-platform,有兴趣的可以私聊博主一起编写,或者给颗star
领域:对支付(FMS,FUND,PAY),订单(OMS),出行行业等有相关的开发领域
🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~

文章目录

  • 1、AOP简介
  • 2、作用
  • 3、实现原理
  • 4、优势
  • 5、应用场景
  • 6、AOP相关术语
  • 7、AOP入门实战
    • 7.1、实现AOP打印每个方法结束后打印日志
      • 7.1.1、aop切面类
      • 7.1.2、要被aop的类
      • 7.1.3、MainConfig配置类
      • 7.1.4、测试类
      • 7.1.5、运行结果
  • 8、AOP通知类型
  • 9、AOP切点表达式

1、AOP简介

在这里插入图片描述

  • AOP的全称是Aspect Oriented Programming,即面向切面编程。是实现功能统一维护的一种技术,它将业务逻辑的各个部分进行隔离,使开发人员在编写业务逻辑时可以专心于核心业务,从而提高了开发效率。

2、作用

  • 在不修改源码的基础上,对已有方法进行增强。

3、实现原理

  • 动态代理技术。

4、优势

  • 减少重复代码、提高开发效率、维护方便

5、应用场景

  • 事务处理
  • 日志管理
  • 权限控制
  • 异常处理等方面。

6、AOP相关术语

名称说明
Joinpoint(连接点)指能被拦截到的点,在Spring中只有方法能被拦截。
Pointcut(切点)指要对哪些连接点进行拦截,即被增强的方法。
Advice(通知)指拦截后要做的事情,即切点被拦截后执行的方法。
Aspect(切面)切点+通知称为切面
Target(目标)被代理的对象
Proxy(代理)代理对象
Weaving(织入)生成代理对象的过程

7、AOP入门实战

  • AspectJ是一个基于Java语言的AOP框架,在Spring框架中建议使用AspectJ实现AOP。

7.1、实现AOP打印每个方法结束后打印日志

7.1.1、aop切面类

package com.zhz.aspect;

import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

import java.util.Date;

/**
 * @author zhouhengzhe
 * @date 2022/11/19
 */
@Slf4j
@Aspect
public class AopAspect {

    /**
     * 指定切面的切入点
     */
    @Pointcut("execution(* com.zhz.dao.BookDao.*(..))")
    public void pointCut() {

    }

    /**
     * 前置通知:执行目标方法前 触发
     */
    @Before("pointCut()")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("当前时间为:"+(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"))+",前置通知——方法名:"+joinPoint.getSignature().getName()+",参数:"+JSON.toJSONString(joinPoint.getArgs()));
    }

    /**
     * 后置通知:执行目标方法后触发
     */
    @After(value = "pointCut()")
    public void logAfter(JoinPoint joinPoint) {
        System.out.println("当前时间为:"+(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"))+",后置通知——方法名:"+joinPoint.getSignature().getName()+",参数:"+JSON.toJSONString(joinPoint.getArgs()));

    }

    /**
     * 返回通知:目标方法执行完并返回参数后触发。
     */
    @AfterReturning(value = "pointCut()", returning = "result")
    public void logAfterReturning(JoinPoint joinPoint, Object result) {
        System.out.println("当前时间为:"+(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"))+",返回通知——方法名:"+joinPoint.getSignature().getName()+",参数:"+JSON.toJSONString(joinPoint.getArgs())+"返回结果:"+ JSON.toJSONString(result));

    }

    /**
     * 异常通知:目标方法抛出异常后触发
     */
    @AfterThrowing(value = "pointCut()", throwing = "ex")
    public void logAfterThrowing(JoinPoint joinPoint, Exception ex) {
        System.out.println("当前时间为:"+(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"))+",异常通知——方法名:"+joinPoint.getSignature().getName()+",参数:"+JSON.toJSONString(joinPoint.getArgs())+",异常信息:" + ex.getMessage());
    }

    /**
     * 环绕通知,围绕着方法执行
     * 环绕通知需要携带ProceedingJoinPoint类型的参数
     * 环绕通知类似于动态代理的全过程:ProceedingJoinPoint类型的参数可以决定是否执行目标方法。
     * 而且环绕通知必须有返回值,返回值即为目标方法的返回值
     */
    @Around(value = "pointCut()")
    public Object logAround(ProceedingJoinPoint proceedingJoinPoint) {
        System.out.println("当前时间为:"+(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"))+",环绕通知前——方法名:"+proceedingJoinPoint.getSignature().getName()+",参数:"+JSON.toJSONString(proceedingJoinPoint.getArgs()));
        Object result = null;
        //执行目标方法
        try {
            result = proceedingJoinPoint.proceed();
            System.out.println("环绕后");
        } catch (Throwable e) {
            System.out.println("环绕异常后");
            throw new RuntimeException(e);
        }
        return result;
    }
}

7.1.2、要被aop的类

package com.zhz.dao;

import org.springframework.stereotype.Repository;

/**
 * @author zhouhengzhe
 * @description: todo
 * @date 2022/11/4 10:56
 * @since v1
 */
@Repository
public class BookDao {
    public void add(){
        System.out.println("新增图书");
    }

    public void delete(){
        System.out.println("删除图书");
    }

    public void update(){
        System.out.println("更新图书");
    }
}

7.1.3、MainConfig配置类

package com.zhz.config;

import com.zhz.aspect.AopAspect;
import com.zhz.dao.BookDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 * @author zhouhengzhe
 * @description: todo
 * @date 2022/11/4 10:27
 * @since v1
 */
@EnableAspectJAutoProxy
@Configuration
public class MainConfig {

    @Bean
    public BookDao bookDao(){
        return new BookDao();
    }

    // 将切面类加入到容器中
    @Bean
    public AopAspect aopAspect() {
        return new AopAspect();
    }
}

7.1.4、测试类

@Test
public void test4(){
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
    BookDao bean = applicationContext.getBean(BookDao.class);
    bean.add();
    applicationContext.close();
}

7.1.5、运行结果

在这里插入图片描述

8、AOP通知类型

通知类型描述
前置通知在方法执行前添加功能
后置通知在方法正常执行后添加功能
异常通知在方法抛出异常后添加功能
最终通知无论方法是否抛出异常,都会执行该通知
环绕通知在方法执行前后添加功能

9、AOP切点表达式

使用AspectJ需要使用切点表达式配置切点位置,写法如下:

  • 标准写法:访问修饰符 返回值 包名.类名.方法名(参数列表)
  • 访问修饰符可以省略。
  • 返回值使用 * 代表任意类型。
  • 包名使用 * 表示任意包,多级包结构要写多个 * ,使用 *… 表示任意包结构
  • 类名和方法名都可以用 * 实现通配
  • 参数列表
    • 基本数据类型直接写类型
    • 引用类型写 包名.类名
    • ***** 表示匹配一个任意类型参数
    • 表示匹配任意类型任意个数的参数
  • 全通配: *** .*(…)**

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系统运行时参数命令--CPU性能监控

目录 2 CPU性能监控 2.1 平均负载和CPU使用率 1 平均负载基础 2 使用uptime命令分析平均负载 3 平均负载与 CPU 使用率 4 CPU使用率监测命令 ps查找进程信息 top命令查询进程的cpu、内存信息 mpstat pidstat 场景一:CPU 密集型进程 场景二:I…

嵌入式开发学习之--DMA(上)

提示:本篇文章主要了解学习一下DMA 文章目录前言一、DMA是什么?二、DMA使用步骤1、外设通道选择2.2、仲裁器2.3、FIFO2.4、存储器端口 外设端口2.5、编程端口三、DMA结构体初始化详解总结前言 上一篇文章学习了串口通信,这一篇我们来学习一下…

虹科案例 | 实现了新的核磁共振应用!(下)

摘要 光纤传感器已成为推动MRI最新功能套件升级和新MRI设备设计背后的关键技术。在这篇文章中,我们介绍了三个基于MRI的运动控制应用,展示了最近开发的、可在市场上买到的基于MRI的安全光纤反馈传感器的操作和使用。 案例研究 案例研究#1用于验证MRI技…

【聆思CSK6 视觉AI开发套件试用】体验AI功能

本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动,更多开发板试用活动请关注极术社区网站。作者:YiCheng 很高兴极术社区和聆思科技举办的开发板申请试用活动,放张开箱图: 开发板介绍NanoKit开发板# NanoKit开发板是…

【算法】前缀和与差分

文章目录1.一维前缀和输入格式输出格式数据范围2.二维前缀和输入格式输出格式数据范围3.一维差分输入格式输出格式数据范围4.二维差分输入格式输出格式数据范围前缀和差分是一对逆运算1.一维前缀和 有一个长度为n的数组an:a1,a2…an; 对于前缀和:Si a1a2…ai 如何…

刷爆力扣之二进制求和

刷爆力扣之二进制求和 HELLO,各位看官大大好,我是阿呆 🙈🙈🙈 今天阿呆继续记录下力扣刷题过程,收录在专栏算法中 😜😜😜 该专栏按照不同类别标签进行刷题,…

Spark零基础入门实战(八)Spark运行时架构

Spark有多种运行模式,可以运行在一台机器上,称为本地(单机)模式,也可以以YARN或Mesos作为底层资源调度系统以分布式的方式在集群中运行,称为Spark On YARN模式,还可以使用Spark自带的资源调度系统,称为Spark Standalone模式。 本地模式通过多线程模拟分布式计算,通常…

如何使用Python创建一个虚拟助理

使用Python创建一个虚拟助手 虚拟助理是基于人工智能的程序。它们是一种智能计算机程序,可以通过语音命令或文本理解人类的自然语言,并为用户执行任务。本文将指导你通过使用Python库来创建你自己的语音助手的过程。 在本教程中,我将在Jetb…

2022已经到了尾声,做一个漂亮的倒计时页面迎接2023年的到来

个人主页:天寒雨落的博客_CSDN博客-初学者入门C语言,python,数据库领域博主 目录 前言 效果图 网页直链 完整代码 倒计时的实现原理 前言 2022即将到来,快来一起做一个元旦倒计时分享给自己喜欢的人吧~ 效果图 网页直链 下面是可以直接访问的网页…

离散数学实践三判别图的连通性【JAVA实现】

文章目录思路重要算法&Warshall 算法代码全部代码效果展示思路 对于给定的邻接矩阵 A,可以用可达矩阵 Warshall 算法求出 A 所表示的图的可达矩阵 P。 对于可达矩阵 P 来说,如果 P 的所有元素均为 111,则所给的有向图是强连通的&#xf…

Python实现的一个简洁轻快的后台管理框架.支持拥有多用户组的RBAC管理后台,不用配置各种运行环境

Mini Admin 完整代码下载地址:Python实现的一个简洁轻快的后台管理框架.支持拥有多用户组的RBAC管理后台 Mini Admin,一个简洁轻快的后台管理框架.支持拥有多用户组的RBAC管理后台 🚀 应用场景:2-5人的管理团队,需要管理的资源数…

Mysql 慢日志处理

勿以恶小而为之,勿以善小而不为---- 刘备 有时候我们需要排查执行缓慢的SQL语句,这就用到了mysql慢查询日志。 开启慢查询日志的方式有两种:临时开启和永久开启。 开启慢查询日志功能可能需要mysql的版本达到5.7 查看版本号 select VERSI…

linux常用命令-路径切换及查看

切换路径-cd 我们可以使用cd(change directory,切换目录)的命令来进行目录切换 常规 其命令格式为 cd [相对路径或绝对路径] 例如: // 使用相对路径,切换到postfix目录下 cd ../postfix// 使用绝对路径切换到/var/…

centos7安装zabbix5.0

zabbix官网:https://www.zabbix.com/ 安装Zabbix存储库 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm yum clean all安装Zabbix server,Web前端,agent yum install zabbix-server-mys…

2023年天津农学院专升本专业课考试考场安排与东西校区入校须知

天津农学院2023年高职升本科专业课考试考场安排等事宜的通知一、考试时间及考场分布情况天津农学院专升本专业课考试2022年12月31日上午在天津农学院东、西校区进行,每位考生请按照准考证上标注的地点参加考试即可,考场安排及考场分布图详见。天津农学院…

docker 安装mysql数据库

docker安装 如果不知道docker怎么安装的,请看docker安装教程 docker 安装mysql 拉取镜像 docker pull mysql:5.7在本地创建目录(存放数据库文件) 容器中的文件,映射到宿主机。 mkdir -p ./mysql/data ./mysql/logs ./mysql/…

FineRrport填报重复数据校验

参考: 校验填报页面的数据是否重复- FineReport帮助文档 - 全面的报表使用教程和学习资料 联立多字段校验是否与数据库中数据重复- FineReport帮助文档 - 全面的报表使用教程和学习资料 1、校验填报页面数据是否重复(多列) 1&#xff09…

Unity Recorder的使用讲解

Unity Recorder的使用讲解使用目的插件下载插件位置窗口基本介绍基本设置选项录制列表Animation Clip参数讲解Movie 电影模式参数介绍SourceGameViewTargeted Camera360ViewRender Texture AssetOutPut ReslutionInclude AudioFlip VerticalTexture SamplingFormatMedia File F…

智慧餐饮远程监控解决方案,让您吃的放心吃的安心

一、行业背景随着国民经济的提高,人们的生活水平也随之提升。近几年,食品安全问题频发,大家也开始对食品安全问题重点关注,尤其是食品生产企业、餐饮单位或学校食堂。自2014年开始,国家食品药品监督管理总局就以及开展…

Docker 概述

系列文章目录 文章目录系列文章目录前言Docker平台用Docker可以做什么Docker架构The Docker daemonThe Docker clientDocker DesktopDocker registriesDocker objectsImagesContainers总结前言 Docker是为开发、运行应用而生的开放的平台。Docker使你可以将应用从依赖中分离&a…