当前位置: 首页 > 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…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...