Spring AOP 事务
目录
一,引入依赖:
二,切面
1,基本概念
2, 通知类型:
3,@Pointcut
4, 切面优先级:
5 ,自定义优先级@Order
6,切点表达式
7, 自定义注解
总结: AOP有几种创建方式
三, Spring AOP原理
1, 代理模式
(1)静态代理
(2)动态代理
△JDK动态代理
△CGLIB动态代理
JDB和cglib的区别
四, 事务
1, 事务依赖
2, @Transactional详解
(1)rollbackFor:
(2)isolation:
(3)propagation
面向切面编程,对于一类问题的统一处理,拦截器,统一结果返回,统一异常都是AOP思想的一种实现. Spring框架实现了这种思想,提供了拦截器技术的相关接口,AOP对源代码没有侵入
一,引入依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>
@Aspect
@Component
@Slf4j
public class TimeAspect {@Around("execution(* com.ABdolphin.blog.controller.*.*(..))")public Object recordTime(ProceedingJoinPoint pip) throws Throwable {long begin=System.currentTimeMillis();Object proceed = pip.proceed();long end=System.currentTimeMillis();log.info(pip.getSignature()+"执行时间: {}ms",end-begin);return proceed;}
}
二,切面
1,基本概念
切面=连接点+切点+通知
连接点:目标方法
切点:通过一个表达式来描述这个切点
通知:具体要做的事情
2, 通知类型:
@Around:环绕通知,此注解标注的通知⽅法在⽬标⽅法前,后都被执⾏
@Before:前置通知,此注解标注的通知⽅法在⽬标⽅法前被执⾏
@After:后置通知,此注解标注的通知⽅法在⽬标⽅法后被执⾏,⽆论是否有异常都会执⾏ @AfterReturning: 返回后通知,此注解标注的通知⽅法在⽬标⽅法后被执⾏,有异常不会执⾏ @AfterThrowing:异常后通知,此注解标注的通知⽅法发⽣异常后执⾏
@Before("execution(* com.ABdolphin.blog.controller.*.*(..))")public void doBefore(){log.info("AspectDemo 执行 doBefore...");}@After("execution(* com.ABdolphin.blog.controller.*.*(..))")public void doAfter(){log.info("AspectDemo 执行 doAfter...");}@AfterReturning("execution(* com.ABdolphin.blog.controller.*.*(..))")public void AfterReturning(){log.info("AspectDemo 执行 AfterReturning...");}@AfterThrowing("execution(* com.ABdolphin.blog.controller.*.*(..))")public void AfterThrowing(){log.info("AspectDemo 执行 AfterThrowing...");}@Around("execution(* com.ABdolphin.blog.controller.*.*(..))")public Object Around(ProceedingJoinPoint pjp) {log.info("AspectDemo 执行 Around前...");Object proceed = null;try {proceed = pjp.proceed();} catch (Throwable e) {log.error("around 发生异常");}log.info("AspectDemo 执行 Around后...");return proceed;}
3,@Pointcut
@Pointcut,可以把公共切点表达式提取出来
#类内部直接调用就可以了@Pointcut("execution(* com.ABdolphin.blog.controller.*.*(..))")public void pt(){}@Before("pt()")public void doBefore(){log.info("AspectDemo 执行 doBefore...");}@After("pt()")public void doAfter(){log.info("AspectDemo 执行 doAfter...");}#类外部,需要将路径描述清楚@Around("com.ABdolphin.blog.common.aspect.AspectDemo.pt()")public Object recordTime(ProceedingJoinPoint pip) throws Throwable {...}
当外部类有使用@Pointcut时,需要将当前类名完整的表述出来
4, 切面优先级:
5 ,自定义优先级@Order
数字越小,优先级越高
6,切点表达式
execution(< 访问修饰符 > < 返回类型 > < 包名 . 类名 . ⽅法 ( ⽅法参数 )> < 异常 >)
切点表达式⽀持通配符表达:
1. * :匹配任意字符,只匹配⼀个元素(返回类型,包,类名,⽅法或者⽅法参数)
a. 包名使⽤ * 表⽰任意包(⼀层包使⽤⼀个*)
b. 类名使⽤ * 表⽰任意类
c. 返回值使⽤ * 表⽰任意返回值类型
d. ⽅法名使⽤ * 表⽰任意⽅法
e. 参数使⽤ * 表⽰⼀个任意类型的参数
2 .. :匹配多个连续的任意符号,可以通配任意层级的包,或任意类型,任意个数的参数
a. 使⽤ .. 配置包名,标识此包以及此包下的所有⼦包
b. 可以使⽤ .. 配置参数,任意个任意类型的参数
其中:访问修饰符,和异常可省略
7, 自定义注解
#注解声明
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface TimeRecord {
}
@Aspect
@Component
@Slf4j
public class TimeAspect {@Around("@annotation(com.ABdolphin.blog.common.aspect.TimeRecord)")public Object recordTime(ProceedingJoinPoint pip) throws Throwable {long begin=System.currentTimeMillis();Object proceed = pip.proceed();long end=System.currentTimeMillis();log.info(pip.getSignature()+"执行时间: {}ms",end-begin);return proceed;}
}
总结: AOP有几种创建方式
1. 基于注解 @Aspect (参考上述课件内容)
2. 基于⾃定义注解(参考⾃定义注解 @annotation 部分的内容)
3. 基于SpringAPI(通过xml配置的⽅式,⾃从SpringBoot⼴泛使⽤之后,这种⽅法⼏乎看不到了)
4. 基于代理来实现(更加久远的⼀种实现⽅式,写法笨重,不建议使⽤)
三, Spring AOP原理
是基于动态代理实现的
1, 代理模式
定义:为其他对象提供⼀种代理以控制对这个对象的访问.它的作⽤就是通过提供⼀个代理类,让我们在调⽤⽬标⽅法的时候,不再是直接对⽬标⽅法进⾏调⽤,⽽是通过代理类间接调用
1. Subject: 业务接⼝类.可以是抽象类或者接⼝(不⼀定有)
2. RealSubject: 业务实现类. 具体的业务执⾏,也就是被代理对象.
3. Proxy: 代理类.RealSubject的代理.
代理模式分为静态代理和动态代理
(1)静态代理
• 静态代理:由程序员创建代理类或特定⼯具⾃动⽣成源代码再对其编译,在程序运⾏前代理类的 .class ⽂件就已经存在了.
#接口
public interface HouseSubject {void rent();void sale();
}
#真实的代理对象
public class RealHouseSubject implements HouseSubject{@Overridepublic void rent() {System.out.println("我是房东,我要租房");}@Overridepublic void sale() {System.out.println("我是房东,我买租房");}
}
#代理方法
public class HouseProxy implements HouseSubject{private RealHouseSubject subject;public HouseProxy(RealHouseSubject subject) {this.subject = subject;}@Overridepublic void rent() {System.out.println("我是中介,我帮房东开始代理");subject.rent();System.out.println("我是中介,我帮房东结束代理");}@Overridepublic void sale() {System.out.println("我是中介,我帮房东开始代理");subject.sale();System.out.println("我是中介,我帮房东结束代理");}
}
public class Main {public static void main(String[] args) {//静态代理HouseProxy houseProxy=new HouseProxy(new RealHouseSubject());houseProxy.rent();houseProxy.sale();}
由于代码都写死了,对目标对象的 每个方法的增强都是手动完成的,非常不灵活. 所以日常开发几乎看不到静态代理的场景
(2)动态代理
• 动态代理:在程序运⾏时,运⽤反射机制动态创建⽽成.一般的实现方式分类两种,①JDK动态代理②CGLIB动态代理
△JDK动态代理
1. 定义⼀个接⼝及其实现类
2. ⾃定义 HouseSubject 和 RealHouseSubject . InvocationHandler 并重写 invoke ⽅法,在 invoke ⽅法中我们会调⽤⽬标⽅法(被代理类的⽅法)并⾃定义⼀些处理逻辑
3. 通过 Proxy.newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h) ⽅法创建代理对象
public class JDKInvocation implements InvocationHandler {#代理的对象private Object target;#初始化(初始化为一个HouseSubject 对象)public JDKInvocation(HouseSubject target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("开始代理");Object invoke = method.invoke(target, args);System.out.println("结束代理");return invoke;}
}
public class Main {public static void main(String[] args) {//JDKHouseSubject target=new RealHouseSubject();HouseSubject proxy= (HouseSubject) Proxy.newProxyInstance(target.getClass().getClassLoader(),new Class[]{HouseSubject.class},new JDKInvocation(target));proxy.rent();proxy.sale();}
△CGLIB动态代理
1. 定义⼀个类(被代理类) MethodInterceptor 并重写
2. ⾃定义法,和JDK动态代理中的 intercept ⽅法, invoke ⽅法类似
3. 通过Enhancer类的create()创建代理类
想要使用Cglib需要引入一个依赖
//cglib<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version></dependency>
public class CglibMethodInvocation implements MethodInterceptor {private Object target;public CglibMethodInvocation(Object target) {this.target = target;}@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("开始代理");Object invoke = method.invoke(target, args);System.out.println("结束代理");return invoke;}
}
public class Main {public static void main(String[] args) {//cglib//如果引用的是Cglib的包的话,,需要添加vm 依赖//--add-opens java.base/java.lang=ALL-UNNAMEDHouseSubject target=new RealHouseSubject();HouseSubject proxy= (HouseSubject) Enhancer.create(target.getClass(),new CglibMethodInvocation(target));proxy.rent();}
如果引用的是Cglib的包的话, 需要添加vm 依赖
--add-opens java.base/java.lang=ALL-UNNAMED
JDB和cglib的区别
spring.aop.proxy-target-class=false
proxyTargetClass | 目标对象 | 代理方式 |
false | 实现了接口 | jdk代理 |
false | 只实现了类 | cglib |
true | 实现了接口 | cglib |
true | 只实现了类 | cglib |
Spring Framework默认是false. Spring Boot默认是true, 即全部是cglib进行代理
JDK只能代理接口,不能代理类. cglib这既可以代理类又可以代理接口
四, 事务
1, 事务依赖
<dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId></dependency>
@Slf4j
@RequestMapping("/trans")
@RestController
public class Test {@Autowiredprivate UserService userService;@Transactional@RequestMapping("/registry")public String registry(String name,String password) {//⽤⼾注册userService.registryUser(name, password);log.info("⽤⼾数据插⼊成功 ");//强制程序抛出异常int a = 10 / 0;return "注册成功";}
}
整个方法中没有异常,提交.如果有异常,就进行回滚,此时上述代码抛出异常(运行时异常,和error异常),则插入的数据也会进行回滚
@Transactional 只作用public生效.它既是类注解也是方法注解,作为类注解,它对类下的所有public方法生效
当异常被catch住了,该方法也将执行成功,不会进行回滚,如果throw出去,则会进行回滚
手动回滚事务
TransactionAspectSupport.currentTransactionStatus()
userService.registryUser(name, password);log.info("⽤⼾数据插⼊成功 ");//强制程序抛出异常try {int a = 10 / 0;}catch (Exception e){System.out.println("发生异常");TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();}return "注册成功";
2, @Transactional详解
(1)rollbackFor:
发生非运行时异常是不会进行回滚的,只有运行时异常和error才会进行回滚
@Transactional(rollbackFor = Exception.class)
当将写成如上代码,就会对所有的异常进行回滚
(2)isolation:
事务隔离级别
· 读未提交:第一个线程还在修改数据,但是没有提交,第二个线程就进行了读操作,就会读到线程一还没有提交的数据,即脏数据,存在的问题为脏读
· 读已提交:读到的是一个线程已经提交后的数据,但是在一个事务中,不同的时间读同一个数据,可能会读到不同的结果,这种现象叫做不可重复读
· 可重复读:事务不会读到其他事务已修改的数据,即使其他事务已经提交,因此,也就可以确保多次查询同一个数据,读到的结果是一致的. 事实上已经插入数据,但是该事务并读不到,因此称之为幻读(实现方法mvcc)
· 串行化:事务的最高隔离级别,他会强制将事务进行排序,但执行效率过低,真正使用的场景不多
(3)propagation
事务的传播机制
A调用B, 下述配置是添加至B上的
①Propagation.REQUIRED: 如果A有事务,则B加入A的事务,如果A没事务,则B创建一个事务(默认值)
②Propagation.SUPPORTS: 若A有事务,则B加入,如果A无事务,则B按照非事务的方式运行
③Propagation.MANDATORY: 若A有事务,则B加入,如果A无事务,则B抛出异常
④Propagation.REQUIRES_NEW: 无论A有没有事务,B都会创建新的事务
⑤Propagation.NOT_SUPPORTED: 无论A有没有事务,B都会以非事务的方式执行
⑥Propagation.NEVER: 以非事务的方式运行,如果存在事务,则抛出异常
⑦Propagation.NESTED: 如果当前存在事务,则创建⼀个事务作为当前事务的嵌套事务来运行. 如果当前没有事务,则该取值等价于 Propagation.REQUIRED
NESTED和REQUIRED区别: 如果事务⼀部分执行成功,REQUIRED加⼊事务会导致整个事务全部回滚.NESTED嵌套事务可以实 现局部回滚,不会影响上⼀个方法中执行的结果
相关文章:
Spring AOP 事务
目录 一,引入依赖: 二,切面 1,基本概念 2, 通知类型: 3,Pointcut 4, 切面优先级: 5 ,自定义优先级Order 6,切点表达式 7, 自定义注解 总结: AOP有几种创建方式 三, Spring AOP原理 1, 代理模式 (1)静态代理 (2)动态代理 △JDK动态代理 △CGLIB动态代理 JDB和c…...
Itext进行PDF的编辑开发
这周写了一周的需求,是制作一个PDF生成功能,其中用到了Itext来制作PDF的视觉效果。其中一些功能不是很懂,仅作记录,若要学习请仔细甄别正确与否。 开始之前,我还是想说,这傻福需求怎么想出来的,…...
Python 中消费者 - 生产者模式详解
目录 引言 消费者 - 生产者模式原理 示例场景 Python 实现消费者 - 生产者模式 使用队列(Queue)实现 代码解释 使用协程实现 代码解释 应用场景 总结 引言 在软件开发里,消费者 - 生产者模式是一种常见且重要的设计模式。这种模式让…...
基于Hadoop的音乐推荐系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 本毕业生数据分析与可视化系统采用B/S架构,数据库是MySQL,网站的搭建与开发采用了先进的Java语言、爬虫技术进行编写,使用了Spring Boot框架。该系统从两个对象:由管理员和用户来对系统进行设计构建。主要功能包括ÿ…...
移动端动态滑动拨盘选择器【Axure元件库】
模拟移动端底部对话框效果,制作的年份、日期滑动拨盘选择器,支持日期动态滑动选择,提升原型制作强度。 该模板主要使用中继器、动态面板和矩形制作,使用简单,复用性强。只需对中继器数据表格中的数据项进行修改、增删…...
7. 深入Spring AI:刨析 Advisors 机制
目录 1、序言2、什么是Advisor?3、源码分析Advisor3.1、Advisor接口3.2、Advisor Ordered3.3、CallAroundAdvisor & StreamAroundAdvisor3.4、BaseAdvisor4、内置的Advisor类型4.1、MessageChatMemoryAdvisor4.2、PromptChatMemoryAdvisor4.3、VectorStoreChatMemoryAdvis…...
高保真动态项目管理图表集
本作品为项目管理图表类原型,以关系图谱、甘特图、流程图、泳道图为核心,提供基础的图表设计风格和交互案例,再进阶到高级的动态交互设计,由浅入深诠释Axure设计高端复杂的动态交互设计的魅力。 作品介绍 原型名称:Ax…...
MCP:AI时代的“万能插座”,开启大模型无限可能
摘要:Model Context Protocol(MCP)由Anthropic在2024年底开源,旨在统一大模型与外部工具、数据源的通信标准。采用客户端-服务器架构,基于JSON-RPC 2.0协议,支持stdio、SSE、Streamable HTTP等多种通信方式…...
IDEA打不开、打开报错
目录 场景异常原因解决 场景 1、本机已经安装了IDEA 2、再次安装另外一个版本的IDEA后打不开、打开报错 异常 这里忘记截图了。。。 原因 情况1-打不开:在同一台电脑安装多个IDEA是需要对idea的配置文件进行调整的,否则打不开 情况2-打开报错&#…...
TM1640学习手册及示例代码
数据手册 TM1640数据手册 数据手册解读 这里我们看管脚定义DIN和SCLK,一个数据线一个时钟线 SEG1~SEG8为段码,GRID1~GRID16为位码(共阴极情况下) 这里VDD给5V 数据指令 数据命令设置 地址命令设置 显示控制命令 共阴极硬件连接图…...
动态规划-零钱兑换
332.零钱兑换 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无…...
leetcode50.pow(x,n)
class Solution {private double f(double x,long n){if(n0)return 1.0;else {double tempf(x,n/2);return n%21?temp*temp*x:temp*temp;}}public double myPow(double x, int n) {long Nn;return n>0?f(x,N):1.0/f(x,-N);} }...
ECA 注意力机制:让你的卷积神经网络更上一层楼
ECA 注意力机制:让你的卷积神经网络更上一层楼 在深度学习领域,注意力机制已经成为提升模型性能的重要手段。从自注意力(Self-Attention)到各种变体,研究人员不断探索更高效、更有效的注意方法。今天我们要介绍一种轻…...
《谷歌Gemini 1.5:长语境理解重塑文档分析与检索新格局》
在人工智能的快速发展进程中,大语言模型不断突破边界,为各个领域带来变革性影响。谷歌Gemini 1.5的问世,凭借其卓越的长语境理解能力,在文档分析和检索任务方面掀起了一阵技术革新的浪潮。 以往的大语言模型在处理长文本时&#…...
量变与质变的辩证关系
量变和质变是唯物辩证法中揭示事物发展状态和形式的一对重要范畴,二者之间存在着密切的辩证关系。 一、量变是质变的必要准备 含义 量变是指事物数量的增减和场所的变更,是一种渐进的、不显著的变化。例如,水的温度升高,从0℃逐…...
讯联桌面TV版apk下载-讯联桌面安卓电视版免费下载安装教程
在智能电视的使用过程中,一款好用的桌面应用能极大提升我们的使用体验。讯联桌面 TV 版就是这样一款备受关注的应用,它可以让安卓电视拥有更个性化、便捷的操作界面。今天,就为大家详细介绍讯联桌面 TV 版 apk 的免费下载安装教程。 一、下载…...
【Vue】组件基础
目录 🚀 Vue 非单文件组件 和 单文件组件 的区别与实践对比 ✨ 引言 一、非单文件组件 1. 基本使用 2. 注意: 3. 组件的嵌套 4. 关于VueComponent: 5. 一个重要的内置关系(有点难理解) 二、 单文件组件 那就…...
OpenCV---图像预处理(四)
OpenCV—图像预处理(四) 文章目录 OpenCV---图像预处理(四)九,图像掩膜9.1 制作掩膜9.2 与运算9.3 颜色替换9.3.19.3.2 颜色替换 十,ROI切割十 一,图像添加水印11.1模板输入11.2 与运算11.3 图像…...
《MySQL:MySQL表的基本查询操作CRUD》
CRUD:Create(创建)、Retrieve(读取)、Update(更新)、Delete(删除)。 Create into 可以省略。 插入否则更新 由于主键或唯一键冲突而导致插入失败。 可以选择性的进行同步…...
Psychology 101 期末测验(附答案)
欢呼 啦啦啦~啦啦啦~♪(^∇^*) 终于考过啦~ 开心(*^▽^*) 撒花✿✿ヽ(▽)ノ✿ |必须晒下证书: 判卷 记录下判卷,还是错了几道,填空题2道压根填不上。惭愧~ 答案我隐藏了,实在想不出答案的朋友可以留言,不定时回复。 建议还是认认真真的学习~认认真真的考试~,知识就…...
Linux:权限相关问题
文章目录 shell命令以及运行的原理Linux权限 shell命令以及运行的原理 操作系统分为内核和外壳程序,xshell是外壳程序,外壳程序包括我们windows桌面上的图形化界面,本质都是翻译给核心处理,再显示出来,而我们输入的命令…...
大模型应用开发大纲
AI大模型学习路径脑图结构 一、AI及LLM基础 学习目标:建立对AI和LLM的基础理解,了解主要的机器学习和神经网络模型,掌握API调用方法。 1.1 AI领域基础概念 AI, NL/NLU/NLG机器学习: 学习方法, 拟合评估神经网络: CNN, RNN, TransformerTra…...
【NCCL】transport建立(一)
transport建立 NCCL transport建立主要在ncclTransportP2pSetup函数中实现。 概况 先简单概括一下ncclTransportP2pSetup函数做了哪些事,方便理解代码流程。 recvpeer 表示本卡作为接收端的对端,sendpeer 表示本卡作为发送端的对端。假设8个rank全连接…...
智慧能源安全新纪元:当能源监测遇上视频联网的无限可能
引言:在数字化浪潮席卷全球的今天,能源安全已成为国家安全战略的重要组成部分。如何构建更加智能、高效的能源安全保障体系?能源安全监测平台与视频监控联网平台的深度融合,正为我们开启一扇通向未来能源管理新世界的大门。这种创…...
腾讯一面-软件开发实习-PC客户端开发方向
1.自我介绍就不多赘述了 2. 请介绍一下你的项目经历 - 介绍了专辑鉴赏项目,前端使用html语言编写,后端基于http协议使用C语言进行网页开发。此外,还提及项目中涉及处理多线程问题以及做过内存池管理项目。 3. 项目中HTTP协议是使用库实现的…...
Cad c# 射线法判断点在多边形内外
1、向量叉乘法 2、射线法原理 射线法是判断点与多边形位置关系的经典算法,核心思想是: 从目标点发出一条水平向右的射线(数学上可视为 y p_y, x \geq p_x 的射线),统计该射线与多边形边的交点数量: - 偶…...
【第16届蓝桥杯软件赛】CB组第一次省赛
个人主页:Guiat 归属专栏:算法竞赛 文章目录 A. 移动距离(5分填空题)B. 客流量上限(5分填空题)C. 可分解的正整数D. 产值调整E. 画展布置F. 水质检测G. 生产车间H. 装修报价 正文 总共10道题。 A. 移动距离…...
DePIN驱动的分布式AI资源网络
GAEA通过通证经济模型激励全球用户共享闲置带宽、算力、存储资源,构建覆盖150多个国家/地区的分布式AI基础设施网络。相比传统云服务,GAEA具有显著优势: 成本降低70%:通过利用边缘设备资源,避免了集中式数据中心所需…...
CC注入Tomcat Upgrade/Executor/WebSocket内存马
学习一下Tomcat中和组件内存马不一样的马。除了学习注入原理外,其payload还在一些缩短payload的场景有应用,比如shiro CC注入Tomcat Upgrade/Executor/WebSocket内存马 漏洞所用环境及测试全部代码https://github.com/godownio/TomcatMemshell 漏洞路…...
算法工程师面试题与参考答案资料(2025年版)
一、核心技术能力 1. 编程能力与工具 问题 1(选择题): 下列哪种Python数据类型是通过哈希表实现的? A. 列表 (list)...
烂土豆Juicypotato提权原理和利用
烂土豆Juicypotato提权原理和利用 0x00 Potato(烂土豆)提权的原理: 所谓的烂土豆提权就是俗称的MS16-075 可以将Windows工作站上的特权从最低级别提升到“ NT AUTHORITY \ SYSTEM” – Windows计算机上可用的最高特权级别。 一、简单的原…...
基于LangChain4J的AI Services实践:用声明式接口重构LLM应用开发
基于LangChain4J的AI Services实践:用声明式接口重构LLM应用开发 前言:当Java开发遇上LLM编程困境 在LLM应用开发领域,Java开发者常面临两大痛点:一是需要手动编排Prompt工程、记忆管理和结果解析等底层组件,二是复杂…...
重构便携钢琴专业边界丨特伦斯便携钢琴V30Pro定义新一代便携电钢琴
在便携电钢琴领域,特伦斯推出的V30Pro折叠钢琴以"技术革新场景适配"的双重升级引发关注。这款产品不仅延续了品牌标志性的折叠结构,更通过声学系统重构与智能交互优化,重新定义了便携乐器的专业边界。 ▶ 核心特点:技术…...
【uniapp-兼容性处理】安卓uView组件中u-input后置插槽不展示
【日期】2025-04-21 【问题】 在小程序上u-input后置插槽展示,真机运行安卓机上不展示 【原因】: 原代码:(插槽写法惯性使用#,此处在APP上不兼容该写法) <u-input v-model"currentScore"…...
每天学一个 Linux 命令(30):cut
可访问网站查看,视觉品味拉满: http://www.616vip.cn/28/index.html cut 命令用于从文件或输入流中提取文本的特定部分(如列、字符或字节位置)。它常用于处理结构化数据(如 CSV、TSV)或按固定格式分割的文本。以下是详细说明和示例: 命令格式 cut [选项] [文件...]…...
部署本地Dify
本文我们来演示一下Dify的部署安装。 一、安装docker环境 Dify只是一个dashboard,所以这里的话咱们一般不用使用物理部署了,直接使用docker启动一个即可,所以一定要先确保服务器上有docker环境和docker-compose环境。 docker的安装可参考&…...
大数据组件学习之--Kafka 安装搭建
一、前置环境 在搭建kafka之前,请确认自己的hadoop、zookeeper是否搭建完成且可正常运行 二、下载并上传安装包(链接为百度网盘) kafka安装包 tar -zxvf /opt/software/kafka_2.12-2.4.1.tgz -C /opt/module/ 进入解压后的目录更改文件名…...
RK3588芯片NPU的使用:PPOCRv4例子在安卓系统部署
本文的目标 将PPOCRv4 C语言例子适配安卓端,提供选择图片后进行OCR识别功能。PPOCRv4 C语言例子请参考之前的博文《RK3588芯片NPU的使用:Windows11 Docker中运行PPOCRv4例子》。 开发环境说明 主机系统:Windows 11目标设备:搭载RK3588芯片的安卓开发板核心工具:Android …...
算法 | 鲸鱼优化算法(WOA)与强化学习的结合研究
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 鲸鱼优化算法与强化学习 一、结合机制与关键方向1、 参数动态调整2、…...
Spring AI 框架-快速搭建以及会话日志(笔记)
概述: Spring AI是Spring生态中应用于人工智能领域的应用框架,它的目标是将Spring 生态系统的设计原则(如可移植性、模块化设计)应用于AI领域,Spring AI更新迭代非常快,对Spring生态非常友好,可以大大简化…...
一段式端到端自动驾驶:VAD:Vectorized Scene Representation for Efficient Autonomous Driving
论文地址:https://github.com/hustvl/VAD 代码地址:https://arxiv.org/pdf/2303.12077 1. 摘要 自动驾驶需要对周围环境进行全面理解,以实现可靠的轨迹规划。以往的方法依赖于密集的栅格化场景表示(如:占据图、语义…...
CMake execute_process用法详解
execute_process 是 CMake 中的一个命令,用于在 CMake 配置阶段(即运行 cmake 命令时)执行外部进程。它与 add_custom_command 或 add_custom_target 不同,后者是在构建阶段(如 make 或 ninja)执行命令。ex…...
使用Postman调测“获取IAM用户Token”接口实际操作
概述 Postman是网页调试与辅助接口调用的工具,具有界面简洁清晰、操作方便快捷的特性,可以处理用户发送的HTTP请求,例如:GET,PUT、POST,DELETE等,支持用户修改HTTP请求中的参数并返回响应数据。…...
大模型面经 | 春招、秋招算法面试常考八股文附答案(三)
大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…...
高效Java面试题(附答案)
Java全家桶 Java基础 1. Java为什么被称为平台无关性语言? 2. 解释下什么是面向对象?面向对象和面向过程的区别 3. 面向对象的三大特性?分别解释下? 4. Java 中的参数传递时传值呢?还是传引用? 5. JD…...
Unreal如何使用后处理材质实现一个黑屏渐变效果
文章目录 前言相机后期处理材质创建材质相机设置动态修改FadeAlpha参数使用示例最后前言 UE5 开发VR ,如何通过PostProcess轻松实现黑屏渐变效果 最简单的办法,其实是使用一个半球形模型,遮挡住相机,然后控制这个半球形遮罩的颜色透明度,至少Unity中默认的Tunneling是这么…...
【自然语言处理与大模型】模型压缩技术之剪枝
一、什么是模型剪枝? 模型剪枝(Model Pruning)是一种神经网络模型压缩技术,其核心思想是通过删除或稀疏化模型中冗余的部分(如不重要的参数或神经元连接),在尽量保持模型性能的前提下࿰…...
OOA-CNN-LSTM-Attention、CNN-LSTM-Attention、OOA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比
OOA-CNN-LSTM-Attention、CNN-LSTM-Attention、OOA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比 目录 OOA-CNN-LSTM-Attention、CNN-LSTM-Attention、OOA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于OOA-CN…...
Android Studio 国内镜像使用与 SDK 下载速度优化指南
本文适用于刚装好 Android Studio、SDK 下载缓慢、更新困难,以及 Gradle 构建缓慢的开发者。我们会讲: 如何替换国内镜像源(包括 SDK 和 Gradle) 如何解决 emulator 镜像下载失败的问题 一些终极提速技巧(比如代理配…...
PyCharm 在 Linux 上的完整安装与使用指南
PyCharm 在 Linux 上的完整安装与使用指南—目录 一、PyCharm 简介二、下载与安装1. 下载 PyCharm2. 安装前的依赖准备3. 安装步骤方法 1:通过 Snap 安装(推荐)方法 2:手动安装(从官网下载 .tar.gz 文件)方…...