【Spring】静态代理、动态代理
Java中,代理模式是一种设计模式,用于通过代理对象控制对目标对象的访问。代理可以分为静态代理和动态代理,其中动态代理又包括JDK动态代理和CGLIB动态代理。这些机制在Spring框架中广泛用于AOP(面向切面编程)、事务管理等场景,尤其与Bean的创建和循环依赖解决密切相关。以下是详细说明,包括代码示例、优缺点、与Spring Bean的关联,以及在循环依赖中的表现。
1. 静态代理
-
定义:静态代理是在编译期手动创建代理类,代理类和目标类实现相同的接口,代理类持有目标对象的引用,并在方法调用前后添加额外逻辑。
-
特点:
- 代理类和目标类需实现同一接口或继承同一父类。
- 代理类在代码中硬编码,针对每个目标类需编写特定代理类。
- 逻辑固定,扩展性较差。
-
代码示例:
// 公共接口 public interface UserService {void save(); }// 目标类 public class UserServiceImpl implements UserService {@Overridepublic void save() {System.out.println("Saving user...");} }// 静态代理类 public class UserServiceProxy implements UserService {private UserService target;public UserServiceProxy(UserService target) {this.target = target;}@Overridepublic void save() {System.out.println("Before save: Logging...");target.save();System.out.println("After save: Logging...");} }// 使用 public class Main {public static void main(String[] args) {UserService target = new UserServiceImpl();UserService proxy = new UserServiceProxy(target);proxy.save();} }
- 输出:
Before save: Logging... Saving user... After save: Logging...
- 输出:
-
优点:
- 实现简单,逻辑清晰。
- 适合目标类较少、代理逻辑固定的场景。
-
缺点:
- 扩展性差:每个目标类需编写一个代理类,代码重复。
- 维护困难:如果接口方法变更,所有代理类需修改。
-
适用场景:
- 简单场景,目标类和代理逻辑固定。
- 学习代理模式或临时实现。
-
与Spring Bean的关系:
- 静态代理不常用于Spring容器,因为Spring更倾向于动态代理来实现AOP。
- 如果在Spring中使用静态代理,需手动创建代理Bean并注入目标Bean,可能影响单例Bean的循环依赖解决(需显式管理代理和目标Bean)。
2. 动态代理
动态代理在运行时动态生成代理类,无需为每个目标类手动编写代理类。Java中主要有两种实现:JDK动态代理和CGLIB动态代理。
2.1 JDK动态代理
-
定义:基于Java反射API(
java.lang.reflect.Proxy
),在运行时动态生成代理类,代理类实现目标对象实现的接口。 -
特点:
- 要求目标类实现至少一个接口,代理类通过接口动态生成。
- 使用
InvocationHandler
处理方法调用,代理逻辑集中在invoke
方法中。 - 代理对象是接口的实现,调用接口方法时转发到
InvocationHandler
。
-
代码示例:
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;// 公共接口 public interface UserService {void save(); }// 目标类 public class UserServiceImpl implements UserService {@Overridepublic void save() {System.out.println("Saving user...");} }// InvocationHandler public class LoggingInvocationHandler implements InvocationHandler {private final Object target;public LoggingInvocationHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Before save: Logging...");Object result = method.invoke(target, args);System.out.println("After save: Logging...");return result;} }// 使用 public class Main {public static void main(String[] args) {UserService target = new UserServiceImpl();InvocationHandler handler = new LoggingInvocationHandler(target);UserService proxy = (UserService) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),handler);proxy.save();} }
- 输出:
Before save: Logging... Saving user... After save: Logging...
- 输出:
-
优点:
- 动态生成代理类,无需手动编写。
- 代理逻辑集中于
InvocationHandler
,易于复用。 - 符合接口规范,适合基于接口的开发。
-
缺点:
- 必须实现接口:目标类若无接口,无法使用JDK动态代理。
- 性能略低于CGLIB(因反射调用)。
-
适用场景:
- 目标类实现了接口(如Spring的AOP默认实现)。
- 需要动态增强接口方法(如日志、事务)。
-
与Spring Bean的关系:
- Spring AOP默认使用JDK动态代理(当目标Bean实现接口时)。
- 单例Bean的代理对象由Spring容器管理,注入时返回代理对象而非原始Bean。
- 循环依赖:Spring通过三级缓存支持代理对象的循环依赖。例如,
BeanA
和BeanB
循环依赖,Spring在三级缓存中存储ObjectFactory
,在需要时生成代理对象,确保循环依赖正确解析。
2.2 CGLIB动态代理
-
定义:基于CGLIB(Code Generation Library),通过字节码生成技术在运行时动态创建目标类的子类作为代理类。
-
特点:
- 不要求目标类实现接口,代理类通过继承目标类实现。
- 使用
MethodInterceptor
拦截方法调用,代理逻辑在intercept
方法中定义。 - 代理类是目标类的子类,覆盖父类方法以添加额外逻辑。
-
代码示例:
import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy;// 目标类(无接口) public class UserService {public void save() {System.out.println("Saving user...");} }// MethodInterceptor public class LoggingInterceptor implements MethodInterceptor {@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("Before save: Logging...");Object result = proxy.invokeSuper(obj, args);System.out.println("After save: Logging...");return result;} }// 使用 public class Main {public static void main(String[] args) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(UserService.class);enhancer.setCallback(new LoggingInterceptor());UserService proxy = (UserService) enhancer.create();proxy.save();} }
- 输出:
Before save: Logging... Saving user... After save: Logging...
- 输出:
-
依赖:
- 需要引入CGLIB库(Spring Boot中通过
spring-core
已包含CGLIB)。 - 示例依赖(Maven):
<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version> </dependency>
- 需要引入CGLIB库(Spring Boot中通过
-
优点:
- 不需要接口,适用范围更广(可代理普通类)。
- 性能略高于JDK动态代理(因字节码生成优于反射)。
- 支持继承关系,代理类可调用父类的非final方法。
-
缺点:
- 无法代理
final
类或final
方法(因无法继承或覆盖)。 - 依赖外部库(CGLIB)。
- 生成的代理类是子类,可能引发继承相关问题。
- 无法代理
-
适用场景:
- 目标类无接口(如Spring AOP中无接口的Bean)。
- 需要高性能动态代理。
-
与Spring Bean的关系:
- Spring AOP在目标Bean无接口时使用CGLIB动态代理。
- 代理对象作为单例Bean存储在Spring容器中,注入时返回代理对象。
- 循环依赖:与JDK动态代理类似,CGLIB代理对象通过三级缓存的
ObjectFactory
生成,支持单例Bean的循环依赖解决。
3. 静态代理 vs JDK动态代理 vs CGLIB动态代理
特性 | 静态代理 | JDK动态代理 | CGLIB动态代理 |
---|---|---|---|
实现方式 | 手动编写代理类 | 基于反射(Proxy ) | 基于字节码(子类生成) |
目标类要求 | 需实现接口或继承 | 必须实现接口 | 无需接口(但不能是final类) |
代理对象类型 | 实现接口或继承目标类 | 实现接口 | 目标类的子类 |
性能 | 高(无运行时开销) | 中等(反射调用) | 较高(字节码生成) |
扩展性 | 差(需为每个类写代理) | 高(动态生成) | 高(动态生成) |
依赖 | 无 | JDK内置 | CGLIB库 |
循环依赖支持 | 手动管理,可能复杂 | 通过三级缓存支持 | 通过三级缓存支持 |
Spring使用场景 | 极少使用 | 默认(有接口时) | 无接口时或强制指定 |
4. 代理与Spring Bean循环依赖
-
单例Bean与代理:
- Spring AOP使用动态代理(JDK或CGLIB)为Bean生成代理对象,增强功能(如事务、日志)。
- 代理对象存储在Spring的一级缓存(
singletonObjects
)中,客户端注入的是代理对象而非原始Bean。 - 三级缓存的
singletonFactories
在循环依赖时生成代理对象。例如:BeanA
和BeanB
循环依赖,BeanA
启用了AOP。- Spring在三级缓存中存储
BeanA
的ObjectFactory
,在BeanB
需要BeanA
时生成代理对象。 - 确保循环依赖正确解析,注入的
BeanA
是代理对象。
-
循环依赖示例:
@Component public class BeanA {@Autowiredprivate BeanB beanB;@Transactional // 启用AOP,生成代理public void doSomething() {System.out.println("BeanA doSomething");} }@Component public class BeanB {@Autowiredprivate BeanA beanA;public void doSomething() {System.out.println("BeanB doSomething");} }
- 解决流程:
- 创建
BeanA
,实例化后放入三级缓存(ObjectFactory
)。 - 为
BeanA
注入beanB
,触发BeanB
创建,放入三级缓存。 BeanB
需要BeanA
,从三级缓存获取BeanA
的代理对象(因@Transactional
)。BeanB
完成,放入一级缓存;BeanA
继续注入beanB
,完成并放入一级缓存。
- 创建
- 结果:
BeanA
的代理对象和BeanB
成功注入,循环依赖解决。
- 解决流程:
-
静态代理与循环依赖:
- 静态代理需手动创建代理Bean并注入目标Bean,可能干扰Spring的三级缓存机制。
- 如果代理Bean和目标Bean都是单例,需确保Spring正确管理依赖关系,否则可能导致循环依赖失败。
5. Spring中代理的选择
- 默认行为:
- 如果目标Bean实现接口,Spring使用JDK动态代理。
- 如果目标Bean无接口,Spring使用CGLIB动态代理。
- 强制CGLIB:
- 在
@EnableAspectJAutoProxy
中设置proxyTargetClass = true
:@EnableAspectJAutoProxy(proxyTargetClass = true) @Configuration public class AppConfig {}
- 或在
application.properties
中:spring.aop.proxy-target-class=true
- 在
- 注意事项:
- JDK动态代理生成接口代理,注入的Bean只能通过接口类型访问。
- CGLIB生成子类代理,注入的Bean可以通过类类型访问,但需注意
final
方法不可代理。 - 循环依赖中,Spring确保代理对象正确生成,客户端无需关心代理类型。
6. 注意事项
- 性能:
- 静态代理性能最高(无运行时开销)。
- CGLIB略快于JDK动态代理,但初始化时字节码生成有一定开销。
- 线程安全:
- 代理对象(如单例Bean)在多线程环境下共享,需确保代理逻辑线程安全。
- Spring的AOP代理通常无状态,天然线程安全。
- 循环依赖:
- 动态代理(JDK/CGLIB)通过三级缓存无缝支持单例Bean的循环依赖。
- 静态代理需手动管理,可能需
@Lazy
或Setter注入解决循环依赖。
- AOP与代理:
- Spring AOP依赖动态代理实现切面(如
@Transactional
、@Around
)。 - 三级缓存的
ObjectFactory
确保AOP代理在循环依赖中正确生成。
- Spring AOP依赖动态代理实现切面(如
- 限制:
- JDK动态代理要求接口,CGLIB无法代理
final
类/方法。 - 静态代理扩展性差,不适合复杂系统。
- JDK动态代理要求接口,CGLIB无法代理
7. 总结
- 静态代理:
- 手动编写代理类,简单但扩展性差,适合简单场景。
- 不常用于Spring,循环依赖需手动管理。
- JDK动态代理:
- 基于接口,动态生成代理类,Spring AOP默认使用。
- 支持循环依赖,适合接口驱动开发。
- CGLIB动态代理:
- 基于子类,适用于无接口的类,性能略优。
- 支持循环依赖,Spring在无接口时使用。
- Spring中的应用:
- 动态代理是Spring AOP的核心,结合三级缓存解决单例Bean的循环依赖。
- 推荐动态代理(JDK或CGLIB)而非静态代理,以支持复杂场景和AOP。
相关文章:
【Spring】静态代理、动态代理
Java中,代理模式是一种设计模式,用于通过代理对象控制对目标对象的访问。代理可以分为静态代理和动态代理,其中动态代理又包括JDK动态代理和CGLIB动态代理。这些机制在Spring框架中广泛用于AOP(面向切面编程)、事务管理…...
关于el-table可展开行实现懒加载的方案
场景: 一个流程记录,以表格的形式展示。点击展开表格的某一行,可以看到该流程的详细记录。但是,详细记录数据独立于表格数据,在还没有展开这一行的时候就不去请求这一行的详细数据,以便加快网络请求的速度。…...
AutoJs相关学习
一、控件点击、模拟点击 如果一个控件的 clickablefalse,但它的父级控件是 clickabletrue,我们可以通过 向上查找父级控件 的方式找到可点击的父级,然后执行点击操作。以下是几种实现方法: 方法 1:使用 parent() 查找可…...
ISO15189认证有什么要求?ISO15189认证流程
ISO 15189 认证要求及流程详解 ISO 15189 是国际标准化组织(ISO)针对 医学实验室质量和能力 的认证标准,适用于医院检验科、第三方医学实验室、血站等机构。该认证确保实验室的技术能力和管理体系符合国际标准,提高检测结果的准确…...
【每天一个知识点】大模型的幻觉问题
“大模型的幻觉问题”是指大语言模型(如GPT系列、BERT衍生模型等)在生成内容时,产生不符合事实或逻辑的虚假信息,即所谓的“幻觉”(hallucination)。这在诸如问答、摘要、翻译、代码生成等任务中尤其常见。…...
光谱相机在肤质检测中的应用
光谱相机在肤质检测中具有独特优势,能够通过多波段光谱分析皮肤深层成分及生理状态,实现非侵入式、高精度、多维度的皮肤健康评估。以下是其核心应用与技术细节: 一、工作原理 光谱反射与吸收特性: 血红蛋白&a…...
【c语言】指针和数组笔试题解析
一维数组: //数组名a如果既不单独放在sizeof()中,也不与&结合,那么就表示数组首元素的大小 //a一般表示数组首元素地址,只有两种情况表示整个数组,sizeof(arr)表示整个数组的大小,&arr表示数组的地址 int a[]…...
【Spring】AutoConfigureOrder与Order注解的区别与使用方式
@AutoConfigureOrder与@Order都是Spring框架中用于控制组件优先级的注解,但它们有不同的应用场景和作用范围。 一、基本区别 1. 包和位置 @Order: 位于org.springframework.core.annotation包,是Spring核心包的一部分@AutoConfigureOrder: 位于org.springframework.boot.au…...
基于SpringBoot的校园赛事直播管理系统-项目分享
基于SpringBoot的校园赛事直播管理系统-项目分享 项目介绍项目摘要管理员功能图用户功能图项目预览首页总览个人中心礼物管理主播管理 最后 项目介绍 使用者:管理员、用户 开发技术:MySQLJavaSpringBootVue 项目摘要 随着互联网和移动技术的持续进步&…...
科研小白可以做哪些准备
断更五个月啦,这段时间一直忙于自己的研究课题。今天给大家分享我在这段时间对科研的一些认识和积累的经验,希望对大家有所帮助。 一、学术研究的认识与思考 什么是科研 什么是好的研究 首先,就是要回答“什么是科研?什么是好研…...
2025.4.22学习日记 JavaScript的常用事件
在 JavaScript 里,事件是在文档或者浏览器窗口中发生的特定交互瞬间,例如点击按钮、页面加载完成等等。下面是一些常用的事件以及案例: 1. click 事件 当用户点击元素时触发 const button document.createElement(button); button.textCo…...
TikTok X-Gnarly纯算分享
TK核心签名校验:X-Bougs 比较简单 X-Gnarly已经替代了_signature参数(不好校验数据) 主要围绕query body ua进行加密验证 伴随着时间戳 浏览器指纹 随机值 特征值 秘钥转换 自写算法 魔改base64编码 与X-bougs 长a-Bougs流程一致。 视频…...
CentOS7 环境配置
CentOS 7 环境配置 我的基础环境: Windows11 CentOS版本:CentOS Linux release 7.7.1908 (Core) Vmware版本:VMware Workstation 17 Pro 17.5.0 build-22583795 使用工具:MobaXterm 注意: 所有有关防火墙的操作都可以…...
缓存,内存,本地缓存等辨析
快速辨析缓存,内存,本地缓存,memcache,redis等 (个人临时记录) 缓存 泛指所有用于暂存数据以提升访问速度的技术,包括本地缓存、分布式缓存、CPU缓存等。核心目标是减少对慢速存储(…...
C++模板学习(进阶)
目录 一.非类型模板参数 二.模板的特化 一).函数模板特化 二).类模板特化 1.全特化 2.偏特化 三.模板分离编译 一).什么是分离编译 1. 问题描述 2. 模板的实例化机制 3. 分离编译的困境 二).解决方法 1. 头文件包含…...
【Git】fork 和 branch 的区别
在 Git 中,“fork” 和 “branch” 是两个不同的概念,它们用于不同的场景并且服务于不同的目的。理解这两者的区别对于有效地使用 Git 进行版本控制非常重要。 1. Fork(分叉) 定义 Fork 是指在 GitHub、GitLab 等代码托管平台上…...
STM32单片机入门学习——第45节: [13-2] 修改频主睡眠模式停止模式待机模式
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.22 STM32开发板学习——第45节: [13-2] 修改主频&睡眠模式&停止模式&待…...
Java中常见API的分类概述及示例
1. 集合框架(java.util 包) 核心接口与实现类 接口实现类特点示例代码ListArrayList, LinkedList有序、可重复List<String> list new ArrayList<>(); list.add("Java");SetHashSet, TreeSet无序、唯一Set<Integer> set …...
IOT项目——物联网 GPS
GeoLinker - 物联网 GPS 可视化工具 项目来源制作引导 项目来源 [视频链接] https://youtu.be/vi_cIuxDpcA?sigMaOKv681bAirQF8 想要在任何地方追踪任何东西吗?在本视频中,我们将向您展示如何使用 ESP32 和 Neo-6M GPS 模块构建 GPS 跟踪器——这是一…...
开源状态机引擎,在实战中可以放心使用
### Squirrel-Foundation 状态机开源项目介绍 **Squirrel-Foundation** 是一个轻量级、灵活、可扩展、易于使用且类型安全的 Java 状态机实现,适用于企业级应用。它提供了多种方式来定义状态机,包括注解声明和 Fluent API,并且支持状态转换、…...
TockOS,一种新安全软件架构的RTOS介绍
文章目录 1. TockOS介绍详细总结 2. TockOS开源项目的目录结构3. 胶囊(Capsules)胶囊的本质胶囊的特点胶囊的应用场景 4. 胶囊的实现模块化设计安全隔离事件驱动可复用性 1. TockOS介绍 Tock 是一款面向 Cortex-M 和 RISC-V 微控制器的安全嵌入式操作系…...
AGI大模型(12):向量检索之关键字搜索
1 检索的方式有那些 列举两种: 关键字搜索:通过用户输入的关键字来查找文本数据。语义搜索:不仅考虑关键词的匹配,还考虑词汇之间的语义关系,以提供更准确的搜索结果。2 关键字搜索 先看一个最基础的实现 安装模块 pip install redis 不会redis的去看我的redis专题 首…...
数据库MySQL学习——day1(创建表与数据类型)
文章目录 1. 创建表(CREATE TABLE)1.1. 创建表的基本语法:1.2. 示例:创建学生信息表 2. 数据类型2.1. 常用的数据类型: 3. 表约束3.1. 常见约束类型:3.2. 示例:添加约束条件3.3. 修改表添加约束…...
基于Transformer与随机森林的多变量时间序列预测
哈喽,我不是小upper,今天和大家聊聊基于Transformer与随机森林的多变量时间序列预测。 不懂Transformer的小伙伴可以看我上篇文章:一文带你彻底搞懂!Transformer !!https://blog.csdn.net/qq_70350287/article/detail…...
【程序员 NLP 入门】词嵌入 - 上下文中的窗口大小是什么意思? (★小白必会版★)
🌟 嗨,你好,我是 青松 ! 🌈 希望用我的经验,让“程序猿”的AI学习之路走的更容易些,若我的经验能为你前行的道路增添一丝轻松,我将倍感荣幸!共勉~ 【程序员 NLP 入门】词…...
MATLAB Coder 应用:转换 MATLAB 代码至 C/C++ | 实践步骤与问题解决
注:本文为 “ MATLAB 代码至 C/C 应用” 相关文章合辑。 未整理去重。 如有内容异常,请看原文。 MATLAB 代码转换为 C/C 代码的详细指南 随心 390 zhihu 发布于 2020-07-12 12:39 在实际项目中,我们常常遇到需要将 MATLAB 代码转换为 C/C …...
BLE 6.0 六大核心特性全解析
写在前面: 2025年1月15日,Bluetooth SIG发布了备受期待的 Bluetooth Core Specification 6.0。相比5.x系列,6.0在测距精度、能耗优化、扫描过滤、音频体验和协议灵活性等方面实现了重大突破。本文将以浅显易懂的语言、丰富的图示和真实案例,带你全面深入了解BLE 6.0的六大核…...
网络应用程序体系结构
本文来源 : 《计算机网络 自顶向下方法》 应用程序体系结构(application architecture)由应用程序研发者设计,规定了如何在各种端系统上组织该应用程序。 现代网络应用程序中使用的两种主流体系结构: (1)客户-服务器…...
Filename too long 错误
Filename too long 错误表明文件名超出了文件系统或版本控制系统允许的最大长度。 可能的原因 文件系统限制 不同的文件系统对文件名长度有不同的限制。例如,FAT32 文件名最长为 255 个字符,而 NTFS 虽然支持较长的文件名,但在某些情况下也…...
Linux学习——UDP
编程的整体框架 bind:绑定服务器:TCP地址和端口号 receivefrom():阻塞等待客户端数据 sendto():指定服务器的IP地址和端口号,要发送的数据 无连接尽力传输,UDP:是不可靠传输 实时的音视频传输&#x…...
C++:继承
目录 一:继承的概念 1.1 继承的定义 1.2 继承方式 1.3 可见性区别 公有方式 私有方式 保护方式 1.4 一般规则 二、继承中的隐藏规则 三、基类和派生类间的转换 四、派生类的默认成员函数 实现一个不能被继承的类 继承与友元 五、继承与静态成员 六、多…...
RSGISLib:一款功能强大的GIS与RS数据处理Python工具包
今天为大家介绍的软件是RSGISLib:一款功能丰富的遥感与GIS数据的python库。下面,我们将从软件的主要功能、支持的系统、软件官网等方面对其进行简单的介绍。 RSGISLib官网网址为:http://rsgislib.org/,它提供了一个丰富的工具集&…...
Git管理
1.创建git仓库 git init 2.让文件添加到暂存区 git add. 3.给暂存区文件添加说明,并提交到本地仓库 git commit -m 说明 4.查看历史记录 git log /git log --oneline 查看状态:git status 5. 引用旧版 git reset --hard commitid 6.创建分支 …...
Java中内部类
1.静态类与非静态类是内部类的区分,外部类不可以被static修饰。 2.类的加载过程:类只有被使用才会被类加载器加载,加载后类的信息放在元空间(方法区)中。类的使用包括初始化对象、静态方法的调用。 3.静态内部类与普…...
[U-Net-Dual]DEU-Net
论文题目:DEU-Net: Dual-Encoder U-Net for Automated Skin Lesion Segmentation 中文题目:DEU-Net:用于自动皮肤病变分割的双编码器U-Net 0摘要 皮肤病的计算机辅助诊断(CAD)在很大程度上依赖于皮肤病变的自动分割,尽管由于病变在形状、大小、颜色和纹理上的多样性以及…...
【数据结构】第五弹——Stack 和 Queue
文章目录 一. 栈(Stack)1.1 概念1.2 栈的使用1.3 栈的模拟实现1.3.1 顺序表结构1.3.2 进栈 压栈1.3.3 删除栈顶元素1.3.4 获取栈顶元素1.3.5 自定义异常 1.4 栈的应用场景1.改变元素序列2. 将递归转化为循环3. 四道习题 1.5 概念分区 二. 队列(Queue)2.1 概念2.2 队列的使用2.3…...
LSTM如何解决梯度消失问题
LSTM如何解决梯度消失问题 一、传统RNN的梯度消失困境 在标准RNN中,隐藏状态更新公式为: h t tanh ( W h h h t − 1 W x h x t b h ) h_t \tanh(W_{hh}h_{t-1} W_{xh}x_t b_h) httanh(Whhht−1Wxhxtbh) 梯度计算通过链式法则展…...
什么是管理思维?
管理思维是指在管理活动中形成的系统性、战略性和创造性的思考方式,帮助个人或团队更高效地达成目标。它不仅适用于企业管理,也适用于个人成长、项目执行和复杂问题解决。以下是关于管理思维的核心内容: 一、管理思维的核心特征 1. 系统性思…...
缓存与内存;缺页中断;缓存映射:组相联
文章目录 内存(RAM)与缓存(Cache)Memory Management Unit缺页中断 多级缓存缓存替换策略缓存的映射方式 内存(RAM)与缓存(Cache) 缓存: CPU 内部或非常靠近的高速存储&a…...
12.5/Q1,GBD高分文章解读
文章题目:Global, regional, and national burdens of early onset pancreatic cancer in adolescents and adults aged 15-49 years from 1990 to 2019 based on the Global Burden of Disease Study 2019: a cross-sectional stud DOI:10.1097/JS9.000…...
路由交换网络专题 | 第六章 | OSPF | BGP | BGP属性 | 防环机制
目录 拓扑图 (1)AS 400 内部使用 OSPF 路由协议,使 PC2 访问 PC3 的路径优先选择 AR2-AR4-AR3。 (2)AS 400 内部使用 RIP 路由协议,使 PC2 访问 PC3 的路径优先选择 AR2-AR4-AR3。 (3&#…...
ubuntu 安装 redis server
ubuntu 安装 redis server sudo apt update sudo apt install redis-server The following NEW packages will be installed:libhiredis0.14 libjemalloc2 liblua5.1-0 lua-bitop lua-cjson redis-server redis-toolssudo systemctl start redis-server sudo systemctl ena…...
基于 Spring Boot实现的图书管理系统
Spring Boot图书管理系统详细分析文档 1. 项目概述 本文档对基于Spring Boot实现的图书管理系统进行详细分析。该项目是一个典型的Web应用程序,采用了Spring Boot框架,结合MyBatis作为ORM工具,实现了图书信息的管理功能,包括图书…...
gradle可用的下载地址(免费)
这几天接手一个老项目,想找gradle老版本的,但一搜,虽然在CSDN上搜索出来一堆,但都是收费,有些甚至要几十积分(吃相有点难看了)。 我找了一个能访问的地址,特地分享出来,有需要的自取!…...
发送百度地图的定位
在vuephp写的聊天软件项目中,增加一个发送百度地图的定位功能 在 Vue PHP 的聊天软件中增加发送百度地图定位功能,需要从前端定位获取、地图API集成、后端存储到消息展示全流程实现。以下是详细步骤: 一、前端实现(Vue/Uni-app…...
滑动窗口学习
2090. 半径为 k 的子数组平均值 题目 问题分析 给定一个数组 nums 和一个整数 k,需要构建一个新的数组 avgs,其中 avgs[i] 表示以 nums[i] 为中心且半径为 k 的子数组的平均值。如果在 i 前或后不足 k 个元素,则 avgs[i] 的值为 -1。 思路…...
python数据分析(二):Python Pandas索引技术详解
Python Pandas索引技术详解:从基础到多层索引 1. 引言 Pandas是Python数据分析的核心库,而索引技术是Pandas高效数据操作的关键。良好的索引使用可以显著提高数据查询和操作的效率。本文将系统介绍Pandas中的各种索引技术,包括基础索引、位…...
(15)VTK C++开发示例 --- 生成随机数的首选方法
文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容👉内容导航 👈👉VTK开发 👈 1. 概述 vtkMinimalStandardRandomSequence 是 VTK(Visualization Toolkit)库中的一个类,…...
华为S系列交换机CPU占用率高问题排查与解决方案
问题概述 在华为S系列交换机(V100&V200版本)运行过程中,CPU占用率过高是一个常见问题,可能导致设备性能下降甚至业务中断。根据华为官方维护宝典,导致CPU占用率高的主要原因可分为四大类:网络攻击、网络震荡、网络环路和硬件…...
为啥低速MCU单板辐射测试会有200M-1Ghz的辐射信号
低速MCU(如8位或16位单片机)单板在辐射测试中出现 200MHz~1GHz的高频辐射信号,看似不合理,但实际上是由多种因素共同导致的。以下是详细原因分析及解决方案: 1.根本原因分析: (1) 时钟谐波与开关噪声 低速MCU的时钟谐…...