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

自己怎么制作网站/百度关键词工具在哪里

自己怎么制作网站,百度关键词工具在哪里,物流公司网站模板,不锈钢网站建设简介: AOP(Aspect-Oriented Programming,面向切面编程) 是一种用于解决软件系统中横切关注点的编程范式。在企业级开发中,很多非业务功能(如日志、事务、权限、安全等)需要在多个模块中执行&am…

简介:

AOP(Aspect-Oriented Programming,面向切面编程) 是一种用于解决软件系统中横切关注点的编程范式。在企业级开发中,很多非业务功能(如日志、事务、权限、安全等)需要在多个模块中执行,而这些功能与核心业务逻辑无关,却经常散布在业务代码中,导致代码冗余和难以维护。通过 AOP,可以将这些通用功能从业务逻辑中分离出来,形成独立的模块化“切面”,并动态地应用到业务逻辑中。Spring AOP 是 Spring 框架的重要组成部分,它通过切面编程为业务逻辑增加附加功能,而无需修改原始代码。

1. AOP 是什么?

AOP 的核心是处理 横切关注点(Cross-Cutting Concerns)。横切关注点指的是那些与业务逻辑无关、但却必须在多个业务逻辑中处理的功能。例如,日志记录、性能监控、安全性检查等,这些功能通常会跨越多个模块,如果不采用 AOP 机制,就必须在每个模块中硬编码这些功能。

AOP 的基本概念

为了深入理解 AOP,我们需要了解以下几个关键术语:

  • 切面(Aspect):切面是 AOP 的核心模块,代表一个横切关注点。它由切点和通知组成,通常是用于定义特定功能的模块,例如日志记录或事务管理。

  • 通知(Advice):通知是实际执行横切功能的代码块。它可以在目标方法执行之前、之后或异常抛出时运行。通知的类型包括:

    • @Before:在目标方法调用前执行。
    • @After:在目标方法调用后执行,无论是否成功。
    • @AfterReturning:在目标方法成功返回后执行。
    • @AfterThrowing:在目标方法抛出异常时执行。
    • @Around:包围目标方法的执行,可以在目标方法前后都执行,并且有能力改变返回值或终止方法执行。
  • 连接点(Join Point):连接点是在程序执行过程中,方法调用、异常抛出或属性访问等可插入切面的点。在 Spring AOP 中,连接点主要是指方法的执行。

  • 切点(Pointcut):切点定义了哪些连接点可以被切面拦截。切点表达式用于指定哪些方法应该应用通知。通过定义切点,开发者可以灵活地控制切面在哪些地方生效。

  • 织入(Weaving):织入是将切面应用到目标对象并创建代理对象的过程。Spring AOP 通过运行时动态代理来实现织入,这意味着切面代码是在程序运行时而不是编译时加入的。

2. 为什么使用 AOP?

在没有 AOP 的情况下,横切关注点(如日志、权限、安全等)通常会与业务逻辑紧密耦合,这样会导致:

  • 代码冗余:每个方法中可能都包含重复的日志、事务处理代码,导致大量冗余代码。

  • 维护困难:随着项目的复杂性增加,每当需要修改这些横切功能时,必须在多个模块中进行更新,容易出现遗漏或错误。

  • 耦合度高:业务逻辑与横切功能的紧密耦合降低了代码的灵活性和可扩展性,增加了维护和测试的难度。

通过 AOP,我们可以将这些横切功能模块化,分别管理它们,并通过声明方式将其动态应用到具体业务逻辑中。这不仅减少了代码冗余,还提高了代码的可维护性、可扩展性和可测试性。

3. Spring Boot 中如何实现 AOP?

Spring Boot 中 AOP 的实现主要依赖于 @Aspect 注解和通知方法。下面我们将详细介绍如何在 Spring Boot 中定义和使用切面。

3.1 项目配置

在 Spring Boot 中引入 AOP 非常简单,只需要在项目的 pom.xml 文件中加入 Spring AOP 依赖即可:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

Spring Boot 会自动配置 AOP 并启用注解支持。

3.2 定义业务逻辑类

首先,创建一个简单的业务服务类 UserService,该类用于用户相关的操作。

import org.springframework.stereotype.Service;@Service
public class UserService {public void createUser(String name) {System.out.println("Creating user: " + name);}public void deleteUser(String name) {System.out.println("Deleting user: " + name);}
}

3.3 定义切面类

接下来,定义一个 LoggingAspect 切面类,在 UserService 的方法执行之前和之后记录日志。

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;@Aspect
@Component
public class LoggingAspect {// 定义一个切点,匹配 UserService 中的所有方法@Pointcut("execution(* com.example.service.UserService.*(..))")public void userServiceMethods() {}// 在方法执行之前记录日志@Before("userServiceMethods()")public void logBeforeMethod() {System.out.println("Before method execution");}// 在方法执行之后记录日志@After("userServiceMethods()")public void logAfterMethod() {System.out.println("After method execution");}
}

在这个切面中,@Pointcut 定义了切点 userServiceMethods(),它匹配 UserService 中的所有方法。然后,使用 @Before 注解在方法执行之前记录日志,@After 注解在方法执行之后记录日志。

3.4 @Around 注解的使用

有时我们希望在方法执行前后都插入逻辑,并且能够控制目标方法的执行或修改其返回值,这时可以使用 @Around 注解。下面的例子演示了如何使用 @Around 通知来监控方法的执行时间。

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;@Aspect
@Component
public class ExecutionTimeAspect {@Around("execution(* com.example.service.UserService.*(..))")public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {long startTime = System.currentTimeMillis();Object result = joinPoint.proceed();  // 执行目标方法long endTime = System.currentTimeMillis();System.out.println("Execution time of " + joinPoint.getSignature() + ": " + (endTime - startTime) + "ms");return result;}
}

在这个例子中,@Around 注解包围了 UserService 的方法执行,记录了方法的执行时间。joinPoint.proceed() 用于调用目标方法,并获取其返回值。

3.5 测试 AOP

编写一个 CommandLineRunner 来测试 UserService 的方法调用以及 AOP 的日志记录。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;@Component
public class AppRunner implements CommandLineRunner {@Autowiredprivate UserService userService;@Overridepublic void run(String... args) throws Exception {userService.createUser("Alice");userService.deleteUser("Bob");}
}

当你运行应用时,控制台将输出以下内容:

Before method execution
Creating user: Alice
After method execution
Before method execution
Deleting user: Bob
After method execution

如果使用了 @Around 注解监控执行时间,还会显示方法的执行时间。

4. AOP 的实际应用场景

AOP 在企业级应用中具有非常广泛的应用场景,常见的场景包括:

  • 日志记录:AOP 可以在不侵入业务代码的情况下,为系统中的所有方法添加统一的日志记录。
  • 事务管理:可以为特定的数据库操作自动启用事务,并在方法失败时回滚事务。
  • 安全检查:可以为某些方法自动添加权限校验逻辑,确保调用者具有访问权限。
  • 性能监控:可以记录方法的执行时间,识别系统中的性能瓶颈。
  • 缓存管理:可以在方法执行之前检查缓存,如果缓存中有结果,则直接返回,否则执行方法并缓存结果。

5. 总结

AOP 是 Spring 和 Spring Boot 中强大的工具,它通过将横切关注点与业务逻辑解耦,提高了代码的模块化、可维护性和复用性。在 Spring Boot 中,AOP 使用简单且灵活,能够轻松应用于日志、事务、安全等场景。

相关文章:

SpirngBoot核心思想之一AOP

简介&#xff1a; AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面编程&#xff09; 是一种用于解决软件系统中横切关注点的编程范式。在企业级开发中&#xff0c;很多非业务功能&#xff08;如日志、事务、权限、安全等&#xff09;需要在多个模块中执行&am…...

足球预测推荐软件:百万数据阐述百年足球历史-大数据模型量化球员成就值

我开始创建这个模型是从梅西22世界杯夺冠第二天开始准备的&#xff0c;当时互联网上充斥了太多了个人情感的输出&#xff0c;有的人借题对C罗冷嘲热讽&#xff0c;有的人质疑梅西的阿根廷被安排夺冠不配超越马拉多纳做GOAT。作为一个从2002年开始看球的球迷&#xff0c;说实话有…...

AD中如何批量修改丝印的大小,节省layout时间

先选中一个元器件的丝印&#xff0c;然后右键&#xff0c;选择“查找相似项” 直接点击OK&#xff0c;这时会发现所有的丝印都会被选中 然后点击右上角的按键&#xff0c;修改其属性。...

Ps:堆栈

将多张类似的图像图层堆叠在一起形成图像堆栈 Stack&#xff0c;通过应用不同的堆栈模式&#xff0c;可以从这些图像中提取有用的信息或达到特定的视觉效果。 Photoshop 中的堆栈技术被广泛应用于摄影后期处理、科学研究、环境监测与分析等领域。 例如&#xff0c;它常用于减少…...

獨立IP和共用IP有什麼區別?

什麼是獨立IP&#xff1f; 獨立IP指的是一個IP地址專屬於一個用戶或設備。無論是網站、伺服器還是其他線上服務&#xff0c;獨立IP都意味著該IP地址不會與其他用戶或設備共用。獨立IP通常用於需要高安全性和穩定性的場景&#xff0c;比如企業網站、電子商務平臺和需要SSL證書的…...

枢纽云EKP数字门户模板上线!轻松复刻胖东来官网,实现数字化逆袭

数字化转型的浪潮中&#xff0c;胖东来凭借着其独特的企业文化和对员工福利的重视&#xff0c;走进了大众视野。近期&#xff0c;胖东来推出了“不开心假”等员工关怀&#xff0c;又一次引发了大众的广泛关注。这种关怀不仅仅提升了员工的幸福感&#xff0c;也间接的改善了顾客…...

从自动化到智能化:AI如何推动业务流程自动化

引言&#xff1a;从自动化到智能化的必然趋势 在当今数字化时代&#xff0c;企业为了提升效率、降低成本&#xff0c;纷纷采用自动化技术来简化重复性任务。然而&#xff0c;传统自动化仅限于标准化操作&#xff0c;无法应对复杂的决策和多变的市场环境。随着人工智能&#xff…...

Selenium与数据库结合:数据爬取与存储的技术实践

目录 一、Selenium与数据库结合的基础概念 1.1 Selenium简介 1.2 数据库简介 1.3 Selenium与数据库结合的优势 二、Selenium爬取数据的基本步骤 2.1 环境准备 2.2 编写爬虫代码 2.3 数据提取 2.4 异常处理 三、数据存储到数据库 3.1 数据库连接 3.2 数据存储 3.3 …...

在 Docker 中进入 Redis 容器后,可以通过以下方法查看 Redis 版本:

文章目录 1、info server2、redis-cli -v 1、info server [rootlocalhost ~]# docker exec -it spzx-redis redis-cli 127.0.0.1:6379> auth 123456 OK 127.0.0.1:6379> info server # Server redis_version:6.2.6 redis_git_sha1:00000000 redis_git_dirty:0 redis_bui…...

Windows 10 系统安装 FFmpeg 查看、转换、编辑音频文件

1、FFmpeg官网&#xff1a;FFmpeg 点击下载 可以选择下载full版本 下载之后解压到指定目录&#xff0c;在系统环境变量 Path 里面新增环境变量 打开CMD终端运行 ffmpeg -version 查看是否安装成功。 2、基本命令 查看音频基本信息 ffprobe 1.mp3 ##输出 [mp3 000002ab334405…...

反调试防护-API

IsDebuggerPresent() CheckRemoteDebuggerPresent() 其内部实际调用NtQueryInformationProcess() bool _stdcall ThreadCall() {while (true){BOOL pbDebuggerPresent FALSE;CheckRemoteDebuggerPresent(GetCurrentProcess(), &pbDebuggerPresent);if (pbDebuggerPres…...

【视频讲解】非参数重采样bootstrap逻辑回归Logistic应用及模型差异Python实现

全文链接&#xff1a;https://tecdat.cn/?p37759 分析师&#xff1a;Anting Li 本文将深入探讨逻辑回归在心脏病预测中的应用与优化。通过对加州大学欧文分校提供的心脏病数据集进行分析&#xff0c;我们将揭示逻辑回归模型的原理、实现过程以及其在实际应用中的优势和不足…...

Linux系统中命令wc

wc&#xff08;word count&#xff09;命令是Linux和Unix系统中用于计算字数的一个非常实用的工具。它可以统计文件的字节数、字数、行数等信息。默认情况下&#xff0c;wc命令会输出这三个统计值&#xff0c;但你也可以通过选项来指定只输出其中的某些值。 基本用法 wc [选项…...

redis集群部署

创建ConfigMap redis-cm.yaml apiVersion: v1 kind: ConfigMap metadata:name: redis-cluster data:update-node.sh: |#!/bin/shREDIS_NODES"/data/nodes.conf"sed -i -e "/myself/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/${POD_IP}/&quo…...

VUE条件树查询

看如下图所示的功能&#xff0c;是不是可高级了&#xff1f;什么&#xff0c;你没看懂&#xff1f;拜托双击放大看&#xff01; 是的&#xff0c;我最近消失了一段时间就是在研究这个玩意的实现&#xff0c;通过不懈努力与钻研并参考其他人员实现并加以改造&#xff0c;很好&am…...

vue框架学习 -- 日历控件 FullCalendar 使用总结

最近在项目中要实现日期排班的功能&#xff0c;正好要用到日历视图的控件&#xff0c;经过对比发现&#xff0c;vue 中 使用 FullCalendar 可以实现相关需求&#xff0c;下面对使用过程做一个总结。 一. 引入 FullCalendar 控件 package.json 中添加相关依赖 "dependen…...

[数据集][目标检测]猪数据集VOC-2856张

数据集格式&#xff1a;Pascal VOC格式(不包含分割的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;2856 标注数量(xml文件个数)&#xff1a;2856 标注类别数&#xff1a;1 标注类别名称:["pig"] 每个类别标注的框数&#xff1a…...

工业制造场景中的设备管理深度解析

在工业制造的广阔领域中&#xff0c;设备管理涵盖多个关键方面&#xff0c;对企业的高效生产和稳定运营起着举足轻重的作用。 一、设备运行管理 1.设备状态监测 实时监控设备的运行状态是确保生产顺利进行的重要环节。通过传感器和数据采集系统等先进技术&#xff0c;获取设备…...

OpenCV图像文件读写(3)统计多页图像文件中的页面数量函数imcount()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 返回给定文件中的图像数量。 imcount 函数将返回多页图像中的页面数量&#xff0c;对于单页图像则返回 1。 函数原型 size_t cv::imcount (cons…...

【数据治理-构建数据标准体系】

构建数据标准体系分为六大主要步骤&#xff0c;分别是&#xff1a; 1、规划数据标准 2、开发数据标准 3、发布数据标准 4、执行数据标准 5、数据标准遵从检查 6、维护数据标准 1、规划数据标准 &#xff08;1&#xff09;数据标准的规划首先是在公司业务架构和数据架构的范围…...

AI新方向:OpenAI o1是一个更擅长思考的模型系列:高级推理+逻辑严密+更广泛的知识,用于解决复杂的逻辑问题,慢思考

之前推出AI store感觉偏应用&#xff0c;也千篇一律&#xff0c;是AI的一个方向&#xff1a;广度。 现在推出o1 更严密的逻辑&#xff0c;也是AI的一个方向&#xff1a;深度。花更多时间&#xff0c;推理复杂的任务并解决比以前的科学、编码和数学模型更难的问题。确保AI的使用…...

Laravel部署后,CPU 使用率过高

我在部署 Laravel 应用程序时遇到严重问题。当访问量稍微大一点的时候&#xff0c;cpu马上就到100%了&#xff0c; 找了一大堆文档和说明&#xff0c;都是说明laravel处理并发的能力太弱&#xff0c;还不如原生的php。最后找到swoole解决问题。 1、php下载swoole插件&#xff0…...

Rust调用tree-sitter支持自定义语言解析

要使用 Rust 调用 tree-sitter 解析自定义语言&#xff0c;你需要遵循一系列步骤来定义语言的语法&#xff0c;生成解析器&#xff0c;并在 Rust 中使用这个解析器。下面是详细步骤&#xff1a; 1. 定义自定义语言的语法 首先&#xff0c;你需要创建一个 tree-sitter 语言定义…...

如何解决跨域请求中的 CORS 错误

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介如何解决跨域请求中的 CORS 错误1. 引言2. 什么是 CORS&#xff1f;2.1 同源策略示例&#xff1a; 2.2 CORS 请求的类型 3. CORS 错误的原因3.1 常见 CORS 错误示例 4. 解决 CORS 错误的常见方法4.1 在服务器端启用 CORS4.1.1 Node…...

计算机知识科普问答--20(96-100)

文章目录 96、为什么要进行内存管理?1. **多进程环境中的内存共享与隔离**举例:2. **提高内存利用率**举例:3. **虚拟内存支持**举例:4. **内存分配的灵活性与效率**举例:5. **内存保护**举例:6. **内存分段和分页的管理**7. **内存交换(Swapping)**举例:8. **提升系统…...

济南站活动回顾|IvorySQL中的Oracle XML函数使用示例及技术实现原理

近日&#xff0c;由中国开源软件推进联盟PG分会 & 齐鲁软件园联合发起的“PostgreSQL技术峰会济南站”在齐鲁开源社举办。瀚高股份IvorySQL作为合作伙伴受邀参加此次活动。 瀚高股份IvorySQL技术工程师 向逍 带来「IvorySQL中的Oracle XML函数兼容」的议题分享。在演讲中&a…...

【电商搜索】现代工业级电商搜索技术-Facebook语义搜索技术QueSearch

【电商搜索】现代工业级电商搜索技术-Facebook语义搜索技术Que2Search 目录 文章目录 【电商搜索】现代工业级电商搜索技术-Facebook语义搜索技术Que2Search目录0. 论文信息1. 研究背景&#xff1a;2. 技术背景和发展历史&#xff1a;3. 算法建模3.1 模型架构3.1.1 双塔与分类 …...

海滨体育馆管理系统:SpringBoot实现技巧与案例

2系统关键技术 2.1JAVA技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;任…...

个人计算机与网络的安全

关于 wifi 大家都知道 wifi 已经使用了 wpa3 非常安全 但很多人不知道 pin 和 wps 这两项有漏洞 我发现很多用户都简单设置了这两项 他们的设置 使他们的网络出现了漏洞 关于 国产的 linux 老实说全是漏洞 默认开启 很多服务 但初始化的设置都有漏洞 关于 系统安全 老…...

AIGC教程:如何用Stable Diffusion+ControlNet做角色设计?

前言 对于生成型AI的画图能力&#xff0c;尤其是AI画美女的能力&#xff0c;相信同行们已经有了充分的了解。然而&#xff0c;对于游戏开发者而言&#xff0c;仅仅是漂亮的二维图片实际上很难直接用于角色设计&#xff0c;因为&#xff0c;除了设计风格之外&#xff0c;角色设…...