Spring AOP---面向切面编程由认识到使用
1. AOP
AOP(Aspect-Oriented Programming), 是一种思想, 面向切面编程。
在前文统一异常处理,统一结果返回就是使用了这一思想(都是在集中处理某一类事情, 但又不影响原有代码的正常运行),但他们不是AOP,只是应用了这一思想。
共同点就是:不修改目标方法,而达到了对目标方法功能的增强(就像MybatisPlus对Mybatis)
AOP是一种思想, 实现它的方式有很多: SpringAOP, AspectJ, CGLIB, ....等
Spring 共有两大核心机制, 一个是 Spring IoC, 一个就是 Spring AOP.
在这句话中,第一个 "Spring" 指的是 Spring Framework,而不是 Spring Boot。
原因是,Spring IoC(控制反转)和 Spring AOP(面向切面编程)是 Spring Framework 的两大核心特性。这些特性是 Spring Framework 的基础,Spring Boot 则是在 Spring Framework 的基础上进行封装和简化配置,使得开发者能更快速地构建应用。
Spring IoC 主要负责对象的管理和依赖注入。
Spring AOP 用于面向切面编程,通过代理机制提供横切关注点(如日志、事务管理等)。
Spring Boot 作为 Spring Framework 的扩展,简化了配置和开发流程,但核心机制(如 IoC 和 AOP)依然是基于 Spring Framework 的。所以当提到 "Spring 的核心机制" 时,通常是指 Spring Framework 中的 IoC 和 AOP。
关于面向切面编程的讲解会在应用中体现
2. Spring AOP 入门
2.1 引入 Spring AOP 依赖
Spring AOP 依赖不能在创建项目时引入, 必须手动引入
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>
2.2 Spring AOP 简单使用
我们使用 Spring AOP 编写一个程序, 记录接口的执行时长.
@Slf4j
@Aspect
@Component
public class TimeAspect {//公共切点表达式@Pointcut("@annotation(com.cym.spring_aop.aspect.MyAspect)")private void pt(){}@Around("pt()")public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {//记录方法执行前的时间long begin = System.currentTimeMillis();//方法执行Object result = pjp.proceed();//记录方法执行后的时间long end = System.currentTimeMillis();log.info(pjp.getSignature() + ",耗费时间:{}" , end - begin);return result;}
}
如上图所示, 通过 Spring AOP, 我们只需在外部通过 Spring AOP 就可以获取到接口的执行时长. 达到了 "获取执行时长" 这一功能和业务代码的解耦
如果不使用 Spring AOP, 我们就需要在每个接口的起始位置和结束位置获取时间戳, 再计算执行时长, 这样不仅入侵了业务代码, 还需要手动对每个要实现这个功能的接口都编写这些代码(对于懒人是一定不能接受的吧)
3.Spring AOP 详解
3.1 核心概念
Spring AOP 有以下 4 个核心概念:
- 切点
- 连接点
- 通知
- 切面
举个例子:
假如你要在所有 Controller 方法执行前打印日志,那么:
切点(Pointcut) = "所有 Controller 里的方法"(切点可以看做是保存了众多连接点的⼀个集合)
连接点(JoinPoint)= "Controller 中某个具体的方法"(满⾜切点表达式规则的⽅法)
通知(Advice) = "方法执行前,打印日志"(对他说:开工吧)
切面(Aspect) = "拦截所有 Controller 方法,在执行前打印日志"
(切⾯(Aspect) = 切点(Pointcut) + 通知(Advice))
3.1.1 切点
切点(Pointcut)本质上只是一个筛选规则, 它不会影响代码执行, 也不会真正“拦截”任何东西, 它只是告诉 Spring 要对哪些方法进行拦截, 对哪些方法生效.
3.1.1.1 @Pointcut 定义切点
切点 = @Pointcut 注解(声明切点) + 切点表达式(定义规则)
切点表达式是切点的一部分, 它决定了切点的“筛选规则”.
切点通过切点表达式定义一套规则, 这个规则表名了对哪些方法生效/拦截哪些方法(是一个集合), 描述哪些方法可能成为连接点
可以选择直接在@Around中写表达式:
@Around("execution(* com.cym.spring_aop.controller.*.*(..))")
也可以写在 pt()中:(可以复用,推荐)
//公共切点表达式@Pointcut("execution(* com.cym.spring_aop.controller.*.*(..))")private void pt(){}@Around("pt()")
还可以在其他切面中使用(使用时, 需要写出这个切点的全限定名):
com.cym.spring_aop.aspect.TimeAspect.pt()
3.1.1.2 切点表达式
常见的切点表达式有以下两种:
execution: 根据方法的签名来匹配 (如上图所示)
@annotation(......): 根据注解匹配
execution 表达式:
语法:
其中, 访问限定修饰符和异常可以省略.
以execution(* com.cym.spring_aop.controller.*.*(..))为例:
/*** 1.TestController 下的 public修饰, 返回类型为String ⽅法名为t1, ⽆参⽅法* execution(public String com.example.demo.controller.TestController.t1())* 2.省略访问修饰符* execution(String com.example.demo.controller.TestController.t1())* 3.匹配所有返回类型* execution(* com.example.demo.controller.TestController.t1())* 4.匹配TestController 下的所有⽆参⽅法* execution(* com.example.demo.controller.TestController.*())* 5.匹配TestController 下的所有⽅法* execution(* com.example.demo.controller.TestController.*(..))* 6.匹配controller包下所有的类的所有⽅法* execution(* com.example.demo.controller.*.*(..))* 7.匹配所有包下⾯的TestController* execution(* com..TestController.*(..))* 8.匹配com.example.demo包下, ⼦孙包下的所有类的所有⽅法* execution(* com.example.demo..*(..))*/
@annotation 表达式:
通过 execution 定义切点表达式, Spring AOP 拦截的是符合方法签名规则的方法.
而通过 @annotation 定义切点表达式, Spring AOP 拦截的是标注了特定注解的方法(可以是自定义注解, 也可以是 Spring 提供的注解), 因此更加灵活.
@annotation 中, 需要写出该注解的完全限定名.
1.第一步定义自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAspect {}
@Target(ElementType.METHOD):标识该注解只能作用于方法
@Retention(RetentionPolicy.RUNTIME):表示注解只存活在运行时,在编译好的文件中不存在
2.在需要拦截的方法前加上该注解
3.根据该注解定义切点表达式
@Pointcut("@annotation(com.cym.spring_aop.aspect.MyAspect)")private void pt(){}@Around("pt()")
3.1.2 连接点
包含在切点表达式中的某个具体的方法, 在程序执行过程中实际被执行的那个方法, 就是一个连接点(即目标方法).
幸运儿,在增强中间执行的方法
切点(Pointcut)是一个筛选规则,用来定义哪些方法(连接点)会被 AOP 代理。
连接点(Join Point)是具体的方法,符合切点规则的方法就是连接点。
3.1.3 通知(Advice)
通知(Advice), 就是 AOP 拦截到目标方法(连接点)后, 具体要做的事/具体要执行的逻辑.
简单来说, 通知就是决定拦截后要做什么事情 .
切点(Pointcut) 只是一个“筛选规则”,它决定哪些方法(连接点)需要被拦截,但它本身不执行任何逻辑.
通知(Advice) 是真正 “干活的人”,它决定拦截后要做什么事情(比如打印日志、权限校验、事务管理等)
3.1.3.1 通知类型
Spring AOP 提供了 5 种常见的通知,不同的通知类型, 执行的时机不同:
• @Around: 环绕通知, 此注解标注的通知⽅法在⽬标⽅法前, 后都被执⾏
• @Before: 前置通知, 此注解标注的通知⽅法在⽬标⽅法前被执⾏
• @After: 后置通知, 此注解标注的通知⽅法在⽬标⽅法后被执⾏, ⽆论是否有异常都会执⾏
• @AfterReturning: 返回后通知, 此注解标注的通知⽅法在⽬标⽅法后被执⾏,
有异常不会执⾏
• @AfterThrowing: 异常后通知, 此注解标注的通知⽅法发⽣异常后执⾏
代码演示:
/*** 前置通知*/@Before("execution(* com.cym.spring_aop.controller.*.*(..))")public void doBefore() {System.out.println("执行doBefore方法");}/*** 后置通知*/@After("execution(* com.cym.spring_aop.controller.*.*(..))")public void doAfter() {System.out.println("执行doAfter方法");}/***抛出异常后通知*/@AfterThrowing("execution(* com.cym.spring_aop.controller.*.*(..))")public void doAfterThrowing() {System.out.println("执行doAfterThrowing方法");}/*** 返回后通知*/@AfterReturning("execution(* com.cym.spring_aop.controller.*.*(..))")public void doAfterReturning() {System.out.println("执行doAfterReturning方法");}/*** 返回后通知*/@Around("execution(* com.cym.spring_aop.controller.*.*(..))")public Object Around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("执行Around方法前..");Object result = pjp.proceed();System.out.println("执行Around方法后..");return result;}
程序正常运行的情况下, @AfterThrowing 标识的通知方法不会执行, 只有抛出异常时, 该通知方法才会执行.
正常执行:
发现执行顺序:@Around > @doBefore > @doAferReturning > @doAfter > @Around
接下来我们添加一个异常 执行一下:
发现执行顺序:@Around > @doBefore > @doAferThrowing > @doAfter
3.1.4 切面优先级
Spring AOP 允许多个切面作用于同一个目标方法.
当多个切面类, 作用于同一个目标方法(连接点)时, 切面之间是有优先级的:
- 先执行优先级高的切面中的通知, 后执行优先级低的切面中的通知.
默认的切面优先级是按照名称来排序的:
不加优先级:
加了优先级
@Order(1)
@Slf4j
@Aspect
@Component
public class Aspect2 {
...
}
@Order(2)
@Slf4j
@Aspect
@Component
public class Aspect3 {
...
}
注意:
对于 JDK 代理. Spring AOP 只对 public 修饰的方法生效,即切点匹配的目标方法必须是 public, 切面的通知才会生效.
对于 CGLib 代理, Spring AOP 对非 private 非 final 修饰的方法生效,即切点匹配的目标方法不能是 private 或者 final 的.
SpringBoot 默认使用的是 CGLib 代理.
综上, 如果要对我们项目中的某个方法进行 AOP 拦截通知, 那么这个方法不能是 private 或者 final 修饰的.
相关文章:
Spring AOP---面向切面编程由认识到使用
1. AOP AOP(Aspect-Oriented Programming), 是一种思想, 面向切面编程。 在前文统一异常处理,统一结果返回就是使用了这一思想(都是在集中处理某一类事情, 但又不影响原有代码的正常运行),但他们不是AOP,只是应用了这…...
深入解析 Python 应用日志监控:ELK、Graylog 的实战指南
深入解析 Python 应用日志监控:ELK、Graylog 的实战指南 引言 在现代应用开发中,日志不仅仅是用于记录错误和调试信息,它更是系统运行状况的窗口,帮助开发者和运维人员监控、优化应用性能。Python 作为广泛应用的开发语言,其应用日志管理的重要性不言而喻。而 ELK(Elas…...
贝叶斯算法实战:从原理到鸢尾花数据集分类
贝叶斯算法实战:从原理到鸢尾花数据集分类 在机器学习的广阔领域中,贝叶斯算法以其基于概率推理的独特优势,成为数据分类和预测的重要工具。今天,我们将通过一段Python代码,深入探讨贝叶斯算法在鸢尾花数据集分类任务…...
CSS学习笔记14——移动端相关知识(rem,媒体查询,less)
移动端 rem适配布局 rem单位 rem基准是相对于html元素的字体大小 父元素设定font-size,子元素根据rem缩放对应字体大小 媒体查询(Media Query) media可以针对不同屏幕尺寸设置不同样式当你重置浏览器大小过程中,页面也会根据…...
使用Node编写轻量级后端快速入门
使用Node编写轻量级后端快速入门 node 要作为轻量级后端需要下载一些对应模块可以参考下面命令。你可以借助 npm(Node Package Manager)来下载它们。 模块下载 express:这是一个广受欢迎的 Node.js Web 应用框架,能用于构建 Web…...
海量数据存储与分析:HBase vs ClickHouse vs Doris 三大数据库优劣对比指南
1.引言 在当今大数据时代,数据正以前所未有的速度持续增长。来自各个领域的数据,如互联网行业用户的每一次点击、浏览记录,金融机构的海量交易数据,以及物联网设备源源不断上传的实时监测数据等,其规模呈指数级攀升。…...
Redis 挂掉后高并发系统的应对策略:使用 Sentinel 实现限流降级与 SkyWalking 监控优化
前言 在现代分布式系统中,Redis 被广泛用作缓存中间件以提升性能和减轻数据库压力。然而,在高并发场景下,一旦 Redis 出现故障(如宕机、网络中断等),如果没有有效的容错机制,可能会导致大量请求…...
C++11新特性_自动类型推导_decltype
decltype 是 C11 引入的一个关键字,用于在编译时推导表达式的类型。它提供了一种方式,让编译器根据表达式的类型来确定变量的类型,而不需要显式地指定类型。下面为你详细介绍 decltype 的使用方法和应用场景。 基本语法 decltype 的基本语法…...
Scrapy爬虫实战总结:动态与登录爬取的精炼经验
引言 在AI时代,信息和数据往往成就你的速度和高度。。。 这篇文章基于前两篇的实践基础之上的一次小结,通过“爬取动态网页”和“登录网站”两场实战,我用Scrapy+Splash破译JavaScript,用FormRequest敲开权限大门。这篇总结凝练两场冒险的体验,淬炼Scrapy爬虫的通用经验…...
windows系统搭建自己的ftp服务器,保姆级教程(用户验证+无验证)
前言 最近在搭建环境时,我发现每次都需要在网上下载依赖包和软件,这不仅耗时,而且有时还会遇到网络不稳定的问题,导致下载速度慢或者中断,实在不太方便。于是,我产生了搭建一个FTP服务器的想法。通过搭建FT…...
PDF本地化开源项目推荐
Stirling-PDF 项目详细总结 1. 项目概述 Stirling-PDF 是一个基于 Docker 的本地化 Web 应用,专注于 PDF 文件的多样化处理。其核心特点是: 完全本地化部署:所有文件处理均在用户设备或服务器内存中进行,任务完成后自动清理临…...
从工厂到生活:算法 × 深度学习,正在改写自动化的底层逻辑
一.背景: 从工业革命时期的机械自动化,到信息时代的智能自动化,人类对自动化技术的追求从未停歇。近年来,随着物联网、大数据、云计算等技术的蓬勃发展,自动化系统的复杂度与智能化程度显著提升。算法与深度学习的深度…...
如何拿奖蓝桥杯
要在蓝桥杯中拿奖,可参考以下方法: 备赛规划方面 - 明确目标与计划:选择自己感兴趣或有基础的组别,了解比赛大纲和历年真题,制定包含基础语法学习、算法入门、真题训练等阶段的合理学习计划。 - 合理安排时间…...
【STM32单片机】#12 SPI通信(软件读写)
主要参考学习资料: B站江协科技 STM32入门教程-2023版 细致讲解 中文字幕 开发资料下载链接:https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 单片机套装:STM32F103C8T6开发板单片机C6T6核心板 实验板最小系统板套件科协 目录 SPI…...
从请求到响应:初探spring web
引入: 首先小编想分享下一些开发小知识 2000年——手写servlet/JSP时代 在这个阶段中,那时候写后端代码,可谓是个麻烦事。 毕竟什么都要自己干 发来的请求都要写extends HttpServlet的类,手动在web.xml配置 <servlet>…...
【中间件】bthread_基础_TaskControl
TaskControl 1 Definition2 Introduce**核心职责** 3 成员解析**3.1 数据结构与线程管理****3.2 任务调度与负载均衡****3.3 线程停放与唤醒(ParkingLot)****3.4 统计与监控** 4 **工作流程**5 **设计亮点**6 **使用场景示例**7 **总结**8 学习过程中的疑…...
systemd和OpenSSH
1 systemd 1.1 配置文件 /etc/systemd/system /lib/systemd/system /run/systemd/system /usr/lib/systemd/user 1.2 commands systemctl list-unit-files | grep enable systemctl cat dlt-daemon.service systemctl cat dlt-system.service systemctl show dlt-daemon.ser…...
08 Python集合:数据 “去重神器” 和运算魔法
文章目录 一、Python 中的集合概述1. 集合的特性 二、集合的创建三、元素的遍历四、集合的运算1. 成员运算2. 二元运算3. 比较运算 五、集合的方法六、不可变集合 一、Python 中的集合概述 在 Python 里,集合(Set)是一种无序且元素唯一的数据…...
配置和使用基本存储
配置和使用基本存储 文章目录 配置和使用基本存储[toc]一、什么是卷?二、卷的类型三、使用EmptyDir卷存储数据1.了解EmptyDir卷2.测试EmptyDir卷的使用 四、使用HostPath卷挂载宿主机文件1.了解HostPath卷2.测试HostPath卷的使用 五、使用NFS卷挂载NFS共享目录1.准备…...
win11 终端 安装ffmpeg 使用终端Scoop
1、安装scoop (Windows 包管理器) Set-ExecutionPolicy RemoteSigned -Scope CurrentUser iwr -useb get.scoop.sh | iex 2、使用scoop来安装ffmpeg scoop install ffmpeg 3、测试一下ffmpeg,将Mp3文件转为Wav文件 ffmpeg -i A.mp3 A.wav 然后我们就看到A.wav生成…...
navicat中导出数据表结构并在word更改为三线表(适用于navicat导不出doc)
SELECTCOLUMN_NAME 列名,COLUMN_TYPE 数据类型,DATA_TYPE 字段类型,IS_NULLABLE 是否为空,COLUMN_DEFAULT 默认值,COLUMN_COMMENT 备注 FROMINFORMATION_SCHEMA.COLUMNS WHEREtable_schema db_animal(数据库名) AND table_name activity(…...
Azure Monitor 实战指南:全方位监控应用与基础设施
Azure Monitor 是 Azure 云原生的统一监控解决方案,能够实时追踪应用性能、基础设施健康状态及日志数据。本文将通过 实战步骤 演示如何利用 Azure Monitor 监控 GPT-4 服务、虚拟机、存储等资源,并结合自动化告警和日志分析,构建企业级监控体系。 1. Azure Monitor 核心功能…...
【人工智能】释放本地AI潜能:LM Studio用户脚本自动化DeepSeek的实战指南
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大型语言模型(LLM)的快速发展,DeepSeek以其高效的性能和开源特性成为开发者关注的焦点。LM Studio作为一款强大的本地AI模型管理工具…...
智能体-CyberTask Orchestrator设计概要(V4.1超长版)
智能体-CyberTask Orchestrator设计概要(V4.0超长版) 一、深度演进背景与战略定位(核心篇幅拓展至2187字) (本段新增行业趋势与技术必要性论证) 1.1 全球网络安全威胁态势分析(2023-2025&…...
C# 面向对象实例演示
C# 面向对象编程实例演示 一、基础概念回顾 面向对象编程(OOP)的四大基本特性: 封装 - 将数据和操作数据的方法绑定在一起继承 - 创建新类时重用现有类的属性和方法多态 - 同一操作作用于不同对象产生不同结果抽象 - 简化复杂系…...
软件产品测试报告:如何全面评估及保障软件质量?
软件产品测试报告可以对软件产品质量做全面评估,还能够把评估结果展示出来,它依靠一系列测试手段和数据分析,能为产品的完善以及决策提供重要依据。下面从不同方面展开说明。 测试目的 开展本次软件产品测试,主要目的有三个。一…...
leetcode42-接雨水
leetcode 42 思路 本题使用 单调栈 来计算每个位置能够接住的雨水量 理解问题 题目要求计算一系列柱子之间可以接住的雨水量。输入是一个数组,每个元素代表柱子的高度。输出是一个整数,表示能够接住的水量。 找到边界条件 什么情况下可以接住雨水…...
普通IT的股票交易成长史--20250430晚
声明:本文章的内容只是自己学习的总结,不构成投资建议。文中观点基本来自yt站Andylee,美股Alpha姐,综合自己的观点得出。感谢他们的无私分享。 送给自己的话: 仓位就是生命,绝对不能满仓!&…...
Elastic Security 8.18 和 9.0 中的新功能
作者:来自 Elastic Mark Settle, Tamarian Del Conte, James Spiteri, Tinsae Erkailo, Charles Davison, Raquel Tabuyo, Kseniia Ignatovych, Paul Ewing, Smriti 检测规则的自动迁移、用于 ES|QL 的 Lookup Join、AI 功能增强,以及更多功能。 Elasti…...
使用 Vue 开发 VS Code 插件前端页面(上)
本文的方案主要参考了这篇博客: Vscode 的 extension webview 开发示例: Vue 和 React 实现 https://juejin.cn/post/7325132202970136585样例项目地址: github | vscode-webview-with-vuehttps://github.com/HiMeditator/vscode-webview-w…...
Vue Router路由原理
Vue Router 是 Vue.js 官方的路由管理器,它与 Vue.js 核心深度集成,使得构建单页应用(SPA)变得非常容易。Vue Router 的主要功能包括动态路由匹配、嵌套路由、编程式导航、命名路由、路由守卫等 Vue Router 原理 单页应用&#x…...
Tauri v1 与 v2 配置对比
本文档对比 Tauri v1 和 v2 版本的配置结构和内容差异,帮助开发者了解版本变更并进行迁移。 配置结构变化 v1 配置结构 {"package": { ... },"tauri": { "allowlist": { ... },"bundle": { ... },"security":…...
详解 MyBatis-Plus 框架中 QueryWrapper 类
QueryWrapper 一、 QueryWrapper 的概念为什么需要 QueryWrapper? 二、 QueryWrapper 的基本使用1. 创建 QueryWrapper 实例2. 添加查询条件3. 执行查询 三、 QueryWrapper 的常见方法1. 基本条件方法1.1 eq - 等于1.2 ne - 不等于1.3 gt - 大于1.4 ge - 大于等于1.…...
小米MiMo-7B大模型:解锁推理潜力的新传奇!
在大语言模型(LLMs)蓬勃发展的时代,推理能力成为衡量模型优劣的关键指标。今天为大家解读的这篇论文,介绍了小米的MiMo-7B模型,它通过独特的预训练和后训练优化,展现出强大的推理实力,快来一探究…...
联邦学习的收敛性分析(全设备参与,不同本地训练轮次)
联邦学习的收敛性分析 在联邦学习中,我们的目标是分析全局模型的收敛性,考虑设备异构性(不同用户的本地训练轮次不同)和数据异质性(用户数据分布不均匀)。以下推导从全局模型更新开始,逐步引入假设并推导期望损失的递减关系,最终给出收敛性结论。 1. 全局模型更新与泰…...
硬件工程师面试常见问题(10)
第四十六问:锁存器,触发器,寄存器三者的区别 触发器:能够存储一位二值信号的基本单元电路统称为 "触发器"。(单位) 锁存器:一位触发器只能传送或存储一位数据,而在实际工…...
1295. 统计位数为偶数的数字
题目 解法一 遍历数组挨个判断元素位数并统计(我的第一想法) class Solution { public:int findNumbers(vector<int>& nums) {int result 0;for(int n: nums){if(judge(n)) result;}return result;}bool judge(int a){int sum 1;a a / 10…...
3.1/Q1,Charls最新文章解读
文章题目:Social participation patterns and associations with subsequent cognitive function in older adults with cognitive impairment: a latent class analysis DOI:10.3389/fmed.2025.1493359 中文标题:认知障碍老年人的社会参与模…...
楼宇智能化四章【期末复习】
四、火灾自动报警系统 结构组成:火灾探测器、区域报警器、集中报警器 形式:1. 多线制系统 2.总线制系统 3.集中智能系统 4.分布智能系统 5.网络通信系统 工作原理: 以下是关于火灾自动报警系统及相关灭火系统的详细解答: 1. 火灾自动报警系统有哪几种形式? 区…...
Splunk 使用Role 实现数据隔离
很多人知道 Splunk 有很多自带的Role, 今天我就要说说定制化的Role: 1: 在创建新role 的界面: 2: 在如下的界面,可以定制allow index name: 3: 创建好新Role 后,在SAML 添加新的group 的时候,就可以看到Role 给某个group: 4: 这样一个特定组的人来申请Splunk 权限,就可…...
Learning vtkjs之ImplicitBoolean
隐式函数布尔操作 介绍 vtkImplicitBoolean 允许对隐式函数(如平面、球体、圆柱体和盒子)进行布尔组合。操作包括并集、交集和差集。可以指定多个隐式函数(所有函数都使用相同的操作进行组合)。 支持的操作:‘UNION…...
LabelVision - yolo可视化标注工具
LabelVision是一款可视化图像标注工具,主要用于计算机视觉研究中的各种标注任务。 支持多边形、矩形、圆形等多种标注方式,并且可以输出JSON、COCO等多种数据格式,方便与其他软件和框架进行集成和互操作。 通过它可以很轻易的对图像进行标注,适合Y…...
系统分析师-第十五章
学习目标 通过参加考试,训练学习能力,而非单纯以拿证为目的。 1.在复习过程中,训练快速阅读能力、掌握三遍读书法、运用番茄工作法。 2.从底层逻辑角度理解知识点,避免死记硬背。 3.通过考试验证学习效果。 学习阶段 快速阅读 …...
大连理工大学选修课——机器学习笔记(3):KNN原理及应用
KNN原理及应用 机器学习方法的分类 基于概率统计的方法 K-近邻(KNN)贝叶斯模型最小均值距离最大熵模型条件随机场(CRF)隐马尔可夫模型(HMM) 基于判别式的方法 决策树(DT)感知机…...
09 Python字典揭秘:数据的高效存储
文章目录 一.字典是什么1.字典的特点 二.字典的创建和使用三.字典的操作1.访问元素2.修改元素3.删除元素4.遍历字典5.成员运算 四.字典方法1.获取字典中的指定元素2.获取字典中的元素3.字典合并4.删除元素 一.字典是什么 在 Python 中,字典(dict&#x…...
20250430在ubuntu14.04.6系统上完成编译NanoPi NEO开发板的FriendlyCore系统【严重不推荐,属于没苦硬吃】
【开始编译SDK之前需要更新源】 rootrootubuntu:~/friendlywrt-h3$ sudo apt update 【这两个目录你在ubuntu14.04.6系统上貌似git clone异常了】 Y:\friendlywrt-h3\out\wireguard Y:\friendlywrt-h3\kernel\exfat-nofuse 【需要单线程编译文件系统,原因不明】 Y:…...
第五部分:进阶项目实战
在前面的学习中,我们已经掌握了图像和视频的基础操作、增强滤波、特征提取以及一些基础的目标检测方法。现在,我们将综合运用这些知识来构建一些更复杂、更实用的应用项目。 这一部分的项目将结合前面学到的技术,并介绍一些新的概念和工具&a…...
【Linux】记录一个有用PS1
PS1 是用来定义shell提示符的环境变量 下面是一个带有颜色和丰富信息的 Linux PS1 配置示例,包含用户名、主机名、路径、时间、Git 分支和退出状态提示: # 添加到 ~/.bashrc 文件末尾 PS1\[\e[1;32m\]\u\[\e[m\] # 绿色粗体用户名 PS…...
【SpringBoot】基于mybatisPlus的博客管理系统(2)
目录 1.实现用户登录 Jwt令牌 1.引入依赖 2.生成令牌(token) Controller Service Mapper 2.实现强制登录 定义拦截器: 配置拦截器: 1.实现用户登录 在之前的项目登录中,我使用的是Session传递用户信息实现校验…...
免费在Colab运行Qwen3-0.6B——轻量高性能实战
Qwen一直在默默地接连推出新模型。 每个模型都配备了如此强大的功能和高度量化的规模,让人无法忽视。 继今年的QvQ、Qwen2.5-VL和Qwen2.5-Omni之后,Qwen团队现在发布了他们最新的模型系列——Qwen3。 这次他们不是发布一个而是发布了八个不同的模型——参数范围从6亿到235…...