当前位置: 首页 > news >正文

springAOP落地实现

文章目录

  • 前言
  • 一、熟悉相关概念:
    • 1、@Aspect:
    • 2、@Pointcut:
    • 3、@Before:
    • 4、@AfterReturning:
    • 5、@AfterThrowing:
    • 6、@After:
    • 7、@Around:
  • 二、具体使用case:
    • 1.pom文件
    • 2.代码
  • 总结


前言

江湖阳哥曾经说过这么句话:
使用技术在当前这个环境中无非就是这么几步:
1、引入POM(maven)坐标
2、改yml(配置文件也可以是properties等等)
3、写配置类或者在启动类上加注解
4、写代码就完事


提示:以下是本篇文章正文内容,下面案例可供参考

一、熟悉相关概念:

在Spring AOP中,注解是
定义切面(Aspects)、切点(Pointcuts)、通知(Advice)等的主要方式。
以下是Spring AOP中几种常见的注解及其用途和如何使用:

1、@Aspect:

  • 作用:标识一个类为切面类。
  • 使用方式:将此注解标注在类上,这个类会包含切点和通知的定义。
  • 示例:
@Aspect
public class MyAspect {// 切点和通知定义...
}

2、@Pointcut:

  • 作用:定义一个切点,即横切关注点的入口,明确什么样的方法调用会被拦截。
  • 使用方式:在方法声明前使用此注解,并提供一个切点表达式,该方法本身通常是空方法,仅作为切点的引用。
  • 示例:
@Aspect
public class MyAspect {@Pointcut("execution(* com.example.service.*.*(..))")public void serviceMethod() {}// 其他通知...
}

3、@Before:

  • 作用:定义一个前置通知,在切点的方法执行之前执行。
  • 使用方式:将此注解放在一个方法上,该方法将在目标方法执行前执行。
  • 示例:
@Aspect
public class MyAspect {@Before("serviceMethod()")public void beforeServiceMethod() {// 前置逻辑...}
}

4、@AfterReturning:

  • 作用:定义一个返回后通知,如果切点的方法正常返回后执行。
  • 使用方式:将此注解放在一个方法上,并通过该方法提供的参数记入返回的值。
  • 示例:
@Aspect
public class MyAspect {@AfterReturning(pointcut = "serviceMethod()", returning = "retVal")public void afterReturning(Object retVal) {// 处理返回值...}
}

5、@AfterThrowing:

  • 作用:定义一个异常通知,如果切点的方法抛出异常后执行。
  • 使用方式:将此注解放在一个方法上,并可选地获取抛出的异常。
  • 示例:
@Aspect
public class MyAspect {@AfterThrowing(pointcut = "serviceMethod()", throwing = "ex")public void afterThrowing(Exception ex) {// 异常处理...}
}

6、@After:

  • 作用:定义一个最终通知,无论切点的方法是正常返回还是抛出异常都会执行。
  • 使用方式:将此注解放在一个方法上,该方法无论目标方法如何都会执行。
  • 示例:
@Aspect
public class MyAspect {@After("serviceMethod()")public void afterServiceMethod() {// 最终逻辑...}
}

7、@Around:

  • 作用:定义一个环绕通知,可以自定义在目标方法前后执行的逻辑,同时决定是否继续执行目标方法。
  • 使用方式:将此注解放在一个方法上,该方法需要返回一个Object,可能是目标方法的返回值,也可能是你自定义的返回值。你可以在此方法中直接调用目标方法。
  • 示例:
@Aspect
public class MyAspect {@Around("serviceMethod()")public Object aroundServiceMethod(ProceedingJoinPoint pjp) throws Throwable {// 前置逻辑...Object result = pjp.proceed(); // 执行目标方法// 后置逻辑...return result;}
}

Spring AOP的使用通常有两种方式:

通过注解驱动的方式:在配置类上使用 @EnableAspectJAutoProxy 注解开启AOP支持,然后声明切面类和相关注解。

通过XML配置的方式:在XML文件中定义 aop:config 元素,并在该元素内部配置切面和通知。

通常情况下,注解驱动的方式更简洁直观,且是推荐的做法。不过,在某些用例或旧项目中,XML配置方式可能还是会用到。

二、具体使用case:

当然,让我们以一个简单的AOP用例为例,实现一个记录方法执行时间的切面。首先确保您的项目已经加入了Spring AOP的相关依赖,例如,使用Maven时,您可以添加下列依赖到您的pom.xml文件:

1.pom文件

<!-- Spring AOP 依赖 -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.3.18</version>
</dependency>
<!-- AOP联盟API -->
<dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>1.0</version>
</dependency>
<!-- Spring框架的一部分,用于处理AOP的代理 -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.3.18</version>
</dependency>

2.代码

现在,让我们创建一个切面,该切面会记录方法执行的时间:

// 具有@Aspect注解的类会被Spring识别为一个切面
@Aspect
// 确保这个类被Spring的容器扫描到,通常它应该位于@ComponentScan指定的包或子包中
@Component
public class PerformanceAspect {// 切点表达式,这里是指任意返回值的Service层中的任意方法@Pointcut("execution(* com.example.service.*.*(..))")public void serviceMethod() {}// 环绕通知,让我们可以在方法执行前后添加自定义逻辑@Around("serviceMethod()")public Object profile(ProceedingJoinPoint pjp) throws Throwable {long start = System.currentTimeMillis(); // 开始时间Object output = pjp.proceed(); // 执行被代理的方法long elapsedTime = System.currentTimeMillis() - start; // 计算消耗的时间System.out.println("Method execution time: " + elapsedTime + " milliseconds.");return output; // 返回被代理方法的返回值}
}

然后,你需要在Spring的配置类加入如下内容,以启用AOP的自动代理功能:

@Configuration
@EnableAspectJAutoProxy
@ComponentScan("com.example") // 修改为你的包名
public class AppConfig {// 可以添加额外的Bean配置...
}

现在,你的AOP切面已经准备好了。当你的程序运行时,任何匹配Pointcut(位于com.example.service包的任意方法)的方法都会被PerformanceAspect所拦截,它会在方法执行前后记录执行时间,并将该时间打印到控制台。
假设我们有一个简单的服务类:

package com.example.service;import org.springframework.stereotype.Service;@Service
public class SimpleService {public void doSomething() {// 模拟业务逻辑处理时间try {Thread.sleep(1000); } catch (InterruptedException e) {Thread.currentThread().interrupt();}}
}

当你调用SimpleService类的doSomething方法时,上述的PerformanceAspect会自动拦截此调用,并且记录该方法的执行时间。这样你就完成了一个针对Spring的AOP入门级案例。


总结

好了尽情的开发使用吧,其实这个是为了我写那个面试题的文章准备的哈哈哈哈

相关文章:

springAOP落地实现

文章目录 前言一、熟悉相关概念&#xff1a;1、Aspect&#xff1a;2、Pointcut&#xff1a;3、Before&#xff1a;4、AfterReturning&#xff1a;5、AfterThrowing&#xff1a;6、After&#xff1a;7、Around&#xff1a; 二、具体使用case&#xff1a;1.pom文件2.代码 总结 前…...

Linux学习之vi/vim详细介绍

目录 ​编辑 1. 什么是 vim&#xff1f; 2. vi/vim 的使用 2.1 命令模式 2.2 输入模式 2.3 底线命令模式 3. vi/vim 使用实例 3.1 使用 vi/vim 进入一般模式 3.2 按下 i 进入输入模式(也称为编辑模式)&#xff0c;开始编辑文字 3.3 按下 ESC 按钮回到一般模式…...

【AIGC大模型】跑通wonder3D (windows)

论文链接&#xff1a;https://arxiv.org/pdf/2310.15008.pdf windows10系统 显卡&#xff1a;NVIDIA rtx 2060 一、安装anaconda 二、安装CUDA 11.7 (CUDA Toolkit 11.7 Downloads | NVIDIA Developer) 和 cudnn 8.9.7(cuDNN Archive | NVIDIA Developer)库 CUDA选择自定…...

Opencv(2)深浅拷贝与基本绘图(c++python

Opencv(2)深浅拷贝与基本绘图 文章目录 Opencv(2)深浅拷贝与基本绘图三、深浅拷贝四、HSV色域(1).意义(2).cvtColor()(3).inRange()(4).适应光线 三、深浅拷贝 浅拷贝是指当图像之间进行赋值时&#xff0c;图像数据并未发生复制&#xff0c;而是两个对象都指向同一块内存块。 …...

二叉树与堆

目录 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1概念 2.2现实中的二叉树&#xff1a; 2.3 特殊的二叉树&#xff1a; 2.4 二叉树的性质 2.5 二叉树的…...

神经网络系列---损失函数

文章目录 损失函数均方误差&#xff08;Mean Squared Error&#xff0c;MSE&#xff09;&#xff1a;平均绝对误差&#xff08;Mean Absolute Error&#xff0c;MAE&#xff09;&#xff1a;交叉熵损失函数&#xff08;Cross-Entropy Loss&#xff09;&#xff1a;Hinge Loss&a…...

LeetCode每日一题 有效的字母异位词(哈希表)

题目描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 示例 1&#xff1a; 输入: s "anagram", t "nagaram" 输…...

设计模式学习笔记 - 面向对象 - 8.实践:贫血模型和充血模型的原理及实践

1.Web开发常用的贫血MVC架构违背OOP吗&#xff1f; 前面我们依据讲过了面向对象四大特性、接口和抽象类、面向对象和面向过程编程风格&#xff0c;基于接口而非实现编程和多用组合少用继承设计思想。接下来&#xff0c;通过实战来学习如何将这些理论应用到实际的开发中。 大部…...

AI新纪元:可能的盈利之道

本文来源于Twitter大神宝玉&#xff08;dotey&#xff09;在聊 Sora 的时候&#xff0c;总结了 Sora 的价值和可能的盈利方向&#xff0c;我把这部分内容单独摘出来再整理一下。现在的生成式 AI 大家应该不陌生&#xff0c;用它总结文章、翻译、写作、画图&#xff0c;当然真正…...

k8s的svc流量通过iptables和ipvs转发到pod的流程解析

文章目录 1. k8s的svc流量转发1.1 service 说明1.2 endpoints说明1.3 pod 说明1.4 svc流量转发的主要工作 2. iptables规则解析2.1 svc涉及的iptables链流程说明2.2 svc涉及的iptables规则实例2.2.1 KUBE-SERVICES规则链2.2.2 KUBE-SVC-EFPSQH5654KMWHJ5规则链2.2.3 KUBE-SEP-L…...

【踩坑】修复报错 you should not try to import numpy from its source directory

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 报错如下&#xff1a; 修复方法一&#xff1a; pip install pyinstaller5.9 修复方法二&#xff1a; pip install numpy1.24.1...

预测脱碳企业的信用评级-论文代码复现

文献来源 【Forecasting credit ratings of decarbonized firms: Comparative assessmentof machine learning models】 文章有代码复现有两个基本工作&#xff0c;1.是提取每个算法的重要性&#xff1b;2.计算每个算法的评价指标 算法有 CRT 分类决策树 ANN 人工神经网络 R…...

目标检测——KITTI目标跟踪数据集

KITTI目标跟踪数据集是由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创建的一个大规模自动驾驶场景下的计算机视觉算法评测数据集。这个数据集主要用于评估立体图像、光流、视觉测距、3D物体检测和3D跟踪等计算机视觉技术在车载环境下的性能这个数据集包含了在市区、乡村和…...

25-k8s集群中-RBAC用户角色资源权限

一、RBAC概述 1&#xff0c;k8s集群的交互逻辑&#xff08;简单了解&#xff09; 我们通过k8s各组件架构&#xff0c;知道各个组件之间是使用https进行数据加密及交互的&#xff0c;那么同理&#xff0c;我们作为“使用”k8s的各种资源的使用者&#xff0c;也是通过https进行数…...

Android 面试问题 2024 版(其二)

Android 面试问题 2024 版&#xff08;其二&#xff09; 六、多线程和并发七、性能优化八、测试九、安全十、Material设计和 **UX/UI** 六、多线程和并发 Android 中的进程和线程有什么区别&#xff1f; 答&#xff1a;进程是在自己的内存空间中运行的应用程序的单独实例&…...

SpringMVC的异常处理

异常分类 : 预期异常(检查型异常)和运行时异常 1、使用@ExceptionHandle注解处理异常 @ExceptionHandle(value={***.class} 异常类型) public modelandview handelException(){} 仅限当前类使用 2、全局处理方式 @ControllerAdvice + @ExceptionHandle 新建类 @Cont…...

【计算机网络】1 因特网概述

一.网络、互联网和因特网 1.网络&#xff08;network&#xff09;&#xff0c;由若干结点&#xff08;node&#xff09;和连接这些结点的链路&#xff08;link&#xff09;组成。 2.多个网络还可以通过路由器互联起来&#xff0c;这样就构成了一个覆盖范围更大的网络&#xf…...

【Ubuntu】Anaconda的安装和使用

目录 1 安装 2 使用 1 安装 &#xff08;1&#xff09;下载安装包 官网地址&#xff1a;Unleash AI Innovation and Value | Anaconda 点击Free Download 按键。 然后 点击下图中的Download开始下载安装包。 &#xff08;2&#xff09;安装 在安装包路径下打开终端&#…...

OpenAI推出首个AI视频模型Sora:重塑视频创作与体验

链接&#xff1a;华为OD机考原题附代码 Sora - 探索AI视频模型的无限可能 随着人工智能技术的飞速发展&#xff0c;AI视频模型已成为科技领域的新热点。而在这个浪潮中&#xff0c;OpenAI推出的首个AI视频模型Sora&#xff0c;以其卓越的性能和前瞻性的技术&#xff0c;引领着…...

mybatis总结传参三

十、&#xff08;不推荐&#xff09;多个参数-按位置传参 参数位置从 0 开始&#xff0c; 引用参数语法 #{ arg 位置 } &#xff0c; 第一个参数是 #{arg0}, 第二个是 #{arg1} 注意&#xff1a; mybatis-3.3 版本和之前的版本使用 #{0},#{1} 方式&#xff0c; 从 myba…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙

WebGL&#xff1a;在浏览器中解锁3D世界的魔法钥匙 引言&#xff1a;网页的边界正在消失 在数字化浪潮的推动下&#xff0c;网页早已不再是静态信息的展示窗口。如今&#xff0c;我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室&#xff0c;甚至沉浸式的V…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...

向量几何的二元性:叉乘模长与内积投影的深层联系

在数学与物理的空间世界中&#xff0c;向量运算构成了理解几何结构的基石。叉乘&#xff08;外积&#xff09;与点积&#xff08;内积&#xff09;作为向量代数的两大支柱&#xff0c;表面上呈现出截然不同的几何意义与代数形式&#xff0c;却在深层次上揭示了向量间相互作用的…...