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

依赖注入详解与案例(前端篇)

依赖注入详解与案例(前端篇)


在这里插入图片描述

一、依赖注入核心概念与前端价值

依赖注入(Dependency Injection, DI) 是一种通过外部容器管理组件/类间依赖关系的设计模式,其核心是控制反转(Inversion of Control, IoC)。在前端开发中,DI通过将服务、配置、工具类等依赖注入到组件中,替代组件直接实例化依赖的方式,实现以下目标:

  1. 解耦代码:组件无需关心依赖的具体实现,仅需定义接口或抽象依赖。
  2. 提升可维护性:依赖关系集中管理,修改或扩展时无需修改业务代码。
  3. 增强可测试性:可轻松注入模拟对象(Mock),便于单元测试。
  4. 支持插件化架构:通过DI实现模块的热插拔扩展。

二、主流前端框架中的DI实现
1. Angular:深度集成的依赖注入系统

Angular通过层级注入器树装饰器语法提供完整的DI支持,是前端DI的典型实现。

  • 核心机制

    • 注入器层级:支持Root Injector(应用级)、Module Injector(模块级)、Component Injector(组件级)三级注入器,允许按需共享依赖。
    • 服务定义:通过@Injectable()装饰器标记服务类,并使用providedIn属性指定注入范围(如'root'表示单例)。
    • 依赖注入:通过构造函数参数注入依赖,支持类型自动推断。
  • 代码示例

    // 1. 定义服务(单例)
    @Injectable({ providedIn: 'root' })
    export class UserService {getUser() { return { id: 1, name: 'John' }; }
    }// 2. 在组件中注入服务
    @Component({selector: 'app-order',template: `订单ID: {{ order.id }}`
    })
    export class OrderComponent {constructor(private userService: UserService) {} // 构造函数注入order = { id: 101, userId: this.userService.getUser().id };
    }// 3. 动态依赖配置(使用Factory)
    @Injectable()
    export class ConfigService {constructor(@Inject('API_URL') private apiUrl: string) {}
    }@NgModule({providers: [{ provide: 'API_URL', useValue: 'https://api.example.com' } // 使用值注入]
    })
    export class AppModule {}
    
  • 关键特性

    • 单例模式providedIn: 'root'确保服务全局唯一。
    • 可选依赖:通过@Optional()装饰器标记非必需依赖。
    • 依赖别名:通过@Inject装饰器为依赖指定别名(如动态配置)。
2. React:Context API与第三方库实现DI

React本身未内置DI系统,但可通过以下方式实现:

  • Context API:适合跨层级组件共享依赖,避免层层传递props。

  • 第三方库:如inversifytsyringe等提供完整的DI容器支持。

  • 代码示例(Context API)

    // 1. 创建上下文
    const UserContext = React.createContext();// 2. 提供依赖的Provider
    function UserProvider({ children }) {const userService = {getUser: () => ({ id: 1, name: 'Alice' }),};return (<UserContext.Provider value={userService}>{children}</UserContext.Provider>);
    }// 3. 注入依赖的组件
    function OrderPage() {const userService = React.useContext(UserContext);return <div>当前用户: {userService.getUser().name}</div>;
    }// 4. 使用
    function App() {return (<UserProvider><OrderPage /></UserProvider>);
    }
    
  • 第三方库示例(inversify)

    import 'reflect-metadata';
    import { Container, injectable, inject } from 'inversify';// 1. 定义接口和实现
    interface IUserService {getUser(): { id: number; name: string };
    }@injectable()
    class UserService implements IUserService {getUser() { return { id: 1, name: 'Bob' }; }
    }// 2. 配置容器
    const container = new Container();
    container.bind<IUserService>('IUserService').to(UserService);// 3. 注入依赖的组件
    @injectable()
    class OrderComponent {constructor(@inject('IUserService') private userService: IUserService) {}render() {return `订单用户: ${this.userService.getUser().name}`;}
    }// 4. 使用
    const order = container.get<OrderComponent>(OrderComponent);
    console.log(order.render()); // 输出: 订单用户: Bob
    
3. Vue.js:Provide/Inject API与插件系统

Vue通过Provide/Inject和插件机制实现DI:

  • Provide/Inject:在祖先组件中提供依赖,在后代组件中注入。

  • 插件机制:通过app.use()全局注入依赖。

  • 代码示例(Provide/Inject)

    // 1. 祖先组件提供依赖
    export default {provide() {return {authService: {isLoggedIn: () => true,},};},template: '<ChildComponent />',
    };// 2. 后代组件注入依赖
    export default {inject: ['authService'],template: `<div>登录状态: {{ authService.isLoggedIn() ? '已登录' : '未登录' }}</div>`,
    };
    
  • 代码示例(插件全局注入)

    // 1. 定义插件
    const authPlugin = {install(app) {app.config.globalProperties.$auth = {isLoggedIn: () => true,};app.provide('authService', { isLoggedIn: () => true }); // 同时支持Provide/Inject},
    };// 2. 注册插件
    const app = createApp(App);
    app.use(authPlugin);// 3. 在组件中使用
    export default {inject: ['authService'], // 或通过this.$auth访问template: `<div>全局认证: {{ authService.isLoggedIn() }}</div>`,
    };
    

三、依赖注入的核心优势
  1. 解耦性
    • 组件与依赖解耦,例如Angular中通过@Injectable()将服务与组件分离。
    • 支持接口抽象(如TypeScript中定义依赖接口)。
  2. 可测试性
    • 轻松注入Mock依赖,例如React中通过Context API注入Mock服务进行单元测试。
    • Angular的测试模块(TestBed)原生支持DI的Mock。
  3. 可维护性
    • 依赖关系集中管理,例如Vue中通过Provide/Inject统一管理跨层级依赖。
    • 修改依赖实现时无需修改注入代码。
  4. 灵活性
    • 支持运行时动态替换依赖,例如Angular中通过useFactory实现依赖的动态创建。
    • 支持依赖作用域隔离(如Angular的层级注入器)。

四、依赖注入的典型应用场景
  1. 服务共享
    • 多个组件共享同一服务实例(如用户认证服务、API客户端)。
    • 示例:Angular中通过providedIn: 'root'共享全局服务。
  2. 插件化架构
    • 通过DI实现插件的热插拔扩展,例如React中通过inversify动态加载插件。
  3. 跨模块通信
    • 替代事件总线或状态管理库,实现模块间通信,例如Vue中通过Provide/Inject传递数据。
  4. 测试驱动开发(TDD)
    • 通过Mock依赖简化单元测试,例如在Vue测试中注入Mock的authService

五、依赖注入的挑战与解决方案
  1. 循环依赖
    • 问题:组件A依赖组件B,组件B又依赖组件A,导致注入失败。
    • 解决方案
      • 重构代码,将公共依赖提取到第三方服务。
      • 使用延迟注入(如Angular的forwardRef)。
  2. 性能开销
    • 问题:频繁的依赖解析可能影响性能。
    • 解决方案
      • 使用单例服务(如Angular中通过providedIn: 'root'实现)。
      • 缓存依赖解析结果(如React中通过useMemo优化Context)。
  3. 类型安全
    • 问题:动态依赖可能导致运行时错误。
    • 解决方案
      • 使用TypeScript严格类型检查。
      • 在Angular中通过@Optional()@Inject避免未注册依赖的错误。

六、总结与最佳实践
  1. 选择适合的DI方案
    • Angular:优先使用内置DI系统。
    • React:小规模项目用Context API,大规模项目用inversify等库。
    • Vue:简单场景用Provide/Inject,复杂场景用插件系统。
  2. 遵循单一职责原则
    • 每个服务/组件应只负责单一功能,避免“上帝类”。
  3. 合理划分依赖作用域
    • 全局依赖用单例,局部依赖用组件级注入。
  4. 编写可测试的代码
    • 通过DI隔离外部依赖,确保组件可独立测试。

完整代码示例(Angular + React + Vue)

1. Angular DI 完整示例
// 1. 定义接口和实现
export interface ILogger {log(message: string): void;
}@Injectable({ providedIn: 'root' })
export class ConsoleLogger implements ILogger {log(message: string) { console.log(message); }
}@Injectable()
export class AppService {constructor(private logger: ILogger) {} // 注入接口process() { this.logger.log('Processing...'); }
}// 2. 在组件中使用
@Component({selector: 'app-root',template: '<button (click)="run()">Run</button>'
})
export class AppComponent {constructor(private appService: AppService) {}run() { this.appService.process(); } // 输出: Processing...
}
2. React DI 完整示例(inversify)
import 'reflect-metadata';
import { Container, injectable, inject } from 'inversify';// 1. 定义依赖
interface IOrderService {getOrders(): string[];
}@injectable()
class OrderService implements IOrderService {getOrders() { return ['Order1', 'Order2']; }
}// 2. 配置容器
const container = new Container();
container.bind<IOrderService>('IOrderService').to(OrderService);// 3. 注入依赖的组件
@injectable()
class OrderList {constructor(@inject('IOrderService') private orderService: IOrderService) {}render() {return this.orderService.getOrders().join(', ');}
}// 4. 使用
const list = container.get<OrderList>(OrderList);
console.log(list.render()); // 输出: Order1, Order2
3. Vue DI 完整示例(Provide/Inject)
// 1. 祖先组件提供依赖
export default {data() {return { theme: 'dark' };},provide() {return { theme: this.theme };},template: '<ChildComponent />',
};// 2. 后代组件注入依赖
export default {inject: ['theme'],template: `<div>当前主题: {{ theme }}</div>`, // 输出: 当前主题: dark
};

通过合理使用依赖注入,前端开发者可以显著提升代码的灵活性、可维护性和可测试性,构建更健壮的应用架构。

在这里插入图片描述

相关文章:

依赖注入详解与案例(前端篇)

依赖注入详解与案例&#xff08;前端篇&#xff09; 一、依赖注入核心概念与前端价值 依赖注入&#xff08;Dependency Injection, DI&#xff09; 是一种通过外部容器管理组件/类间依赖关系的设计模式&#xff0c;其核心是控制反转&#xff08;Inversion of Control, IoC&…...

Spark 的 Shuffle 机制:原理与源码详解

Apache Spark 是一个分布式数据处理框架&#xff0c;专为大规模数据分析设计。其核心操作之一是 Shuffle&#xff0c;这是一个关键但复杂的机制&#xff0c;用于在某些操作期间在集群中重新分配数据。理解 Shuffle 需要深入探讨其目的、机制和实现&#xff0c;既包括概念层面&a…...

IdeaVim配置指南

一、什么是 IdeaVim&#xff1f; IdeaVim 是 JetBrains 系列 IDE&#xff08;如 IntelliJ IDEA, WebStorm, PyCharm 等&#xff09;中的一个插件&#xff0c;让你在 IDE 里使用 Vim 的按键习惯&#xff0c;大大提升效率。 安装方法&#xff1a; 在 IDE 中打开 设置(Settings) →…...

[监控看板]Grafana+Prometheus+Exporter监控疑难排查

采用GrafanaPrometheusExporter监控MySQL时发现经常数据不即时同步&#xff0c;本示例也是本地搭建采用。 Prometheus面板 1&#xff0c;Detected a time difference of 11h 47m 22.337s between your browser and the server. You may see unexpected time-shifted query res…...

P56-P60 统一委托,关联游戏UI,UI动画,延迟血条

这一部分首先把复杂的每个属性委托全部换成了简洁可复用的委托,之后重新修改了UI蓝图,然后在新增了一个与之前表格关联的动画与血条延迟下降的蓝图 OverlayAuraWidgetController.h // Fill out your copyright notice in the Description page of Project Settings. #pragma …...

智能修复大模型生成的 JSON 字符串:Python 实现与优化

在使用大语言模型(LLM)生成 JSON 格式数据时,常因模型输出不完整、语法错误或格式不规范导致 JSON 解析失败。本文介绍如何通过 json_repair 库实现对 LLM 生成 JSON 字符串的自动修复,并改进原始提取函数以提升容错能力。 一、LLM 生成 JSON 的常见问题 LLM 输出的 JSON …...

【PPT制作利器】DeepSeek + Kimi生成一个初始的PPT文件

如何基于DeepSeek Kimi进行PPT制作 步骤&#xff1a; Step1&#xff1a;基于DeepSeek生成文本&#xff0c;提问 Step2基于生成的文本&#xff0c;用Kimi中PPT助手一键生成PPT 进行PPT渲染-自动渲染 可选择更改模版 生成PPT在桌面 介绍的比较详细&#xff0c;就是这个PPT模版…...

华为设备端口隔离

端口隔离的理论与配置指南 一、端口隔离的理论 基本概念 端口隔离&#xff08;Port Isolation&#xff09;是一种在交换机上实现的安全功能&#xff0c;用于限制同一VLAN内指定端口间的二层通信。被隔离的端口之间无法直接通信&#xff0c;但可通过上行端口访问公共资源&#…...

YOLO12改进-C3K2模块改进-引入离散余弦变换DCT 减少噪声提取图像的细节、边缘和纹理等微观特征

离散余弦变换&#xff08;Discrete Cosine Transform, DCT&#xff09;由 Nasir Ahmed 于 1974 年提出&#xff0c;最初是为了优化数据压缩。其核心思想是将信号从空间域转换为频率域&#xff0c;从而实现冗余信息的压缩。DCT 在图像和视频处理领域应用广泛&#xff0c;例如 JP…...

基于大模型的自然临产阴道分娩全流程预测与方案研究报告

目录 一、引言 1.1 研究背景与目的 1.2 研究意义 1.3 国内外研究现状 二、大模型技术原理与应用概述 2.1 大模型基本原理 2.2 在医疗领域的应用现状 2.3 用于分娩预测的优势 三、术前预测与准备方案 3.1 产妇身体状况评估指标 3.2 大模型预测流程与方法 3.3 基于预…...

用 Tailwind CSS 优化你的 Vue 3 项目! ! !

Vue 3 的响应式魅力 TailwindCSS 的原子级美学 前端开发的舒适巅峰&#xff01; 在现代前端开发中&#xff0c;组件驱动 原子化 CSS 正在成为新的标准。如果你已经在使用 Vue 3&#xff0c;那不妨试试 Tailwind CSS —— 一个强大的原子化 CSS 框架&#xff0c;它能让你几乎…...

PostgreSQL数据库的array类型

PostgreSQL数据库相比其它数据库&#xff0c;有很多独有的字段类型。 比如array类型&#xff0c;以下表的pay_by_quarter与schedule两个字段便是array类型&#xff0c;即数组类型。 CREATE TABLE sal_emp (name text,pay_by_quarter integer[],schedule t…...

融智学视角集大成范式革命:文理工三类AI与网络大数据的赋能

融智学视角下的“集大成”范式革命&#xff1a;AI与大数据的终极赋能 一、化繁为简的工具革命&#xff1a;AI与大数据的三重解构 信息压缩的数学本质 Kolmogorov复杂度极限突破&#xff1a; K_AI(x)min_p∈P_NN ℓ(p)λ⋅dist(U(p),x) &#xff08;神经网络程序p的描述长度语…...

【2025】Visio 2024安装教程保姆级一键安装教程(附安装包)

前言 大家好&#xff01;最近很多朋友在问我关于Visio 2024的安装问题&#xff0c;尤其是对于那些需要制作专业流程图和组织结构图的小伙伴来说&#xff0c;这款软件简直是必不可少的办公神器&#xff01;今天就给大家带来这篇超详细保姆级的Visio 2024安装教程&#xff0c;不…...

C++【继承】

继承 1.继承1.1 继承的概念1.2继承的定义1.2.1定义格式1.2.2继承基类成员访问方式的变化 1.3继承模板 2.基类和派生类之间的转换 1.继承 1.1 继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许我们在保持原有类特性的基础上…...

理解字、半字与字节 | 从 CPU 架构到编程实践的数据类型解析

注&#xff1a;本文为 “字、半字、字节” 相关文章合辑。 略作重排&#xff0c;未全校。 如有内容异常&#xff0c;请看原文。 理解计算机体系结构中的字、半字与字节 在计算机科学中&#xff0c;理解“字 (Word)”、“半字 (Half-Word)”和“字节 (Byte)”等基本数据单元的…...

VMware搭建ubuntu保姆级教程

目录 VMware Ubuntu 虚拟机配置指南 创建虚拟机 下载 Ubuntu ISO 新建虚拟机 网络配置&#xff08;双网卡模式&#xff09; 共享文件夹设置 SSH 远程访问配置 VMware Ubuntu 虚拟机配置指南 创建虚拟机 下载 Ubuntu ISO 【可添加我获取】 官网&#xff1a;Get Ubunt…...

内容社区系统开发文档

1 系统分析 1.1 项目背景 1.2 需求分析 2 系统设计 2.1 系统功能设计 2.2 数据库设计 2.2.1 数据库需求分析 2.2.2 数据库概念结构设计 2.2.3 数据库逻辑结构设计 2.2.4 数据库物理结构设计 2.2.5 数据库视图设计 2.2.6 函数设计 2.2.7 存储过程设计 2.2.8 触发器…...

Ubuntu开放端口

在 Ubuntu 中&#xff0c;我们可以使用 ufw (Uncomplicated Firewall) 来管理防火墙。以下是打开 80 和 8090 端口的步骤&#xff1a; 首先检查防火墙状态 sudo ufw status 如果防火墙没有启用&#xff0c;先启用它&#xff1a; sudo ufw enable 允许 80 端口&#xff08;…...

PyTorch 与 TensorFlow 中基于自定义层的 DNN 实现对比

深度学习双雄对决&#xff1a;PyTorch vs TensorFlow 自定义层大比拼 目录 深度学习双雄对决&#xff1a;PyTorch vs TensorFlow 自定义层大比拼一、TensorFlow 实现 DNN1. 核心逻辑 二、PyTorch 实现自定义层1. 核心逻辑 三、关键差异对比四、总结 一、TensorFlow 实现 DNN 1…...

质量员考试案例题有哪些常见考点?

质量员考试案例题常见考点如下&#xff1a; 施工质量控制 施工工艺与工序&#xff1a;如混凝土浇筑时的振捣时间、方法&#xff0c;若振捣不充分会导致混凝土出现蜂窝、麻面等质量问题。 施工环境&#xff1a;例如在高温天气下进行砌筑作业&#xff0c;未对砌块进行适当处理或…...

Axure疑难杂症:深度理解与认识“事件”“动作”(玩转交互)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:深度理解与认识“事件”“动作” 主要内容:事件、动作定义、本质、辩证关系、执行顺序 应用场景:原型交互 …...

【AI知识库云研发部署】RAGFlow + DeepSeek

gpu 安装screen&#xff1a;yum install screen 配置ollama&#xff1a; 下载官方安装脚本并执行&#xff1a; curl -fsSL https://ollama.com/install.sh | sh 通过screen后台运行ollama&#xff1a;screen -S ollama 在screen会话中启动服务&#xff1a; export OLLA…...

HTML07:表格标签

表格 基本结构 单元格行列跨行跨列 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>表格学习</title><style>td {text-align: center;vertical-align: middle;}</style> </he…...

【专家库】Kuntal Chowdhury

昆塔尔乔杜里 Kuntal Chowdhury 是 NVIDIA 的 6G 开发者关系经理和技术布道师。他致力于推动与 NVIDIA 平台和工具的开发者和早期采用者生态系统的联系&#xff0c;以促进 6G 研究社区的蓬勃发展。在此之前&#xff0c;他是 BlueFusion, Inc. 的创始人&#xff0c;这是一家创新…...

IAA-Net:一种实孔径扫描雷达迭代自适应角超分辨成像方法——论文阅读

IAA-Net:一种实孔径扫描雷达迭代自适应角超分辨成像方法 1. 论文的研究目标与实际意义1.1 研究目标1.2 实际问题与产业意义2. 论文的创新方法、公式与优势2.1 方法框架与核心步骤2.2 核心公式与推导2.2.1 回波模型与目标函数2.2.2 正则化加权矩阵设计2.2.3 迭代更新公式2.2.4 …...

[论文阅读]MCP Guardian: A Security-First Layer for Safeguarding MCP-Based AI System

MCP Guardian: A Security-First Layer for Safeguarding MCP-Based AI System http://arxiv.org/abs/2504.12757 推出了 MCP Guardian&#xff0c;这是一个框架&#xff0c;通过身份验证、速率限制、日志记录、跟踪和 Web 应用程序防火墙 &#xff08;WAF&#xff09; 扫描来…...

提示词工程:通向AGI时代的人机交互艺术

‌引言&#xff1a;从基础到精通的提示词学习之旅‌ 欢迎来到 ‌"AGI时代核心技能"‌ 系列课程的第二模块——‌提示词工程‌。在这个模块中&#xff0c;我们将系统性地探索如何通过精心设计的提示词&#xff0c;释放大型语言模型的全部潜力&#xff0c;实现高效、精…...

地级市-机器人、人工智能等未来产业水平(2009-2023年)-社科数据

地级市-机器人、人工智能等未来产业水平&#xff08;2009-2023年&#xff09;-社科数据https://download.csdn.net/download/paofuluolijiang/90623814 https://download.csdn.net/download/paofuluolijiang/90623814 此数据集统计了2009-2023年全国地级市在机器人、人工智能等…...

神经网络中之多类别分类:从基础到高级应用

神经网络中之多类别分类&#xff1a;从基础到高级应用 摘要 在机器学习领域&#xff0c;多类别分类是解决复杂问题的关键技术之一。本文深入探讨了神经网络在多类别分类中的应用&#xff0c;从基础的二元分类扩展到一对多和一对一分类方法。我们详细介绍了 softmax 函数的原理…...

破解工业3D可视化困局,HOOPS Visualize助力高效跨平台协作与交互!

一、当前3D可视化面临的痛点 &#xff08;1&#xff09;性能瓶颈 现有的许多3D可视化工具在处理大型复杂模型时往往力不从心。例如在航空航天、汽车制造等高端制造业&#xff0c;动辄涉及数以亿计的三角面片和海量的纹理细节。这些超大规模的模型在渲染时常常出现卡顿、延迟&…...

感知器准则感知器神经元模型——等价

不同的东西&#xff0c;很多刊物有误。但两者等价。 感知器神经元模型的误差反馈学习 y y y&#xff1a;期望值 y ^ \hat{y} y^​&#xff1a;实际输出值 权重更新公式为&#xff1a; w i ← w i η ( y − y ^ ) x i w_i \leftarrow w_i \eta(y - \hat{y})x_i wi​←wi​…...

Qt学习Day0:Qt简介

0. 关于Qt Qt是C的实践课&#xff0c;之前在C中学习的语法可以有具体的应用场景。Qt的代码量很大&#xff0c;不要死记硬背&#xff0c;学会查询文档的能力更加重要。 建议提升一下相关单词的储备量&#xff1a; 1. Qt是什么&#xff1f; Qt是一个基于C语言的图形用户界面&a…...

JAVA设计模式——(十二)原型模式(Prototype Pattern)

JAVA设计模式——&#xff08;十二&#xff09;原型模式&#xff08;Prototype Pattern&#xff09; 介绍理解实现Email类测试 应用 介绍 用原型实例指定创建对象的种类&#xff0c;并且通过复制原型已有的对象用于创建新的对象。 理解 原型实例便是我们需要复制的类的实例&…...

C++命名空间

什么是命名空间 命名空间是一种用来避免命名冲突的机制&#xff0c;它可以将一段代码的名称隔离开&#xff0c;使其与其他代码的名称不冲突 简单来说,就是编译器检测到相同的名称的函数,变量,或者其他的相同名称的东西,也许会有疑问,怎么能出现相同的名称的变量呢.这就是C引入的…...

Hello Robot 推出Stretch 3移动操作机器人 提升开源与可用性

Stretch 3机器人是Hello Robot推出的新一代移动操作机器人&#xff0c;专注于提升开源开发与实际应用能力。它结合了先进的设计理念和工程技术&#xff0c;旨在为家庭任务和辅助技术提供智能化解决方案。通过优化硬件性能和软件兼容性&#xff0c;这款机器人不仅增强了灵活性&a…...

[Linux_69] 数据链路层 | Mac帧格式 | 局域网转发 | MTU MSS

目录 0.引入 1.以太网帧格式 2.重谈局域网转发的原理(基于协议) 小结 3.认识MTU 3.1MTU对IP协议的影响 3.2MTU对UDP协议的影响 3.3MTU对于TCP协议的影响 0.引入 在去年的这篇文章中&#xff0c;我们有对网络进行过一个概述[Linux#47][网络] 网络协议 | TCP/IP模型 | 以…...

I2C总线驱动开发:MPU6050应用

引言 I2C&#xff08;Inter-Integrated Circuit&#xff09;总线作为嵌入式系统中广泛使用的通信协议&#xff0c;在传感器、外设控制等领域扮演着重要角色。本文将深入探讨I2C总线的工作原理、Exynos4412平台裸机驱动实现、Linux内核中的I2C子系统架构&#xff0c;并以MPU605…...

15.命令模式:思考与解读

原文地址:命令模式&#xff1a;思考与解读 更多内容请关注&#xff1a;深入思考与解读设计模式 引言 在软件开发中&#xff0c;尤其是当系统涉及多个请求、操作或任务时&#xff0c;你是否遇到过这样的情况&#xff1a;每个操作都有自己的执行逻辑&#xff0c;且这些操作可能…...

2025年软件工程与数据挖掘国际会议(SEDM 2025)

2025 International Conference on Software Engineering and Data Mining 一、大会信息 会议简称&#xff1a;SEDM 2025 大会地点&#xff1a;中国太原 收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等 二、会议简介 2025年软件开发与数据挖掘国际会议于…...

博客系统测试报告

文章目录 目录1. 项目背景2. 项目简介3. 测试工具4. 测试用例5. 功能测试6. 性能测试7. 弱网测试8. 自动化测试9. bug简述10. 测试结论 目录 项目背景项目简介测试工具测试用例功能测试性能测试弱网测试自动化测试bug简述测试结论 1. 项目背景 为了将平时自己写的笔记、知识…...

window 显示驱动开发-线程同步和 TDR

下图显示了 Windows 显示驱动程序模型 (WDDM) 中显示微型端口驱动程序的线程同步的工作原理 如果发生硬件超时&#xff0c;则会启动 超时检测和恢复 (TDR) 进程。 GPU 计划程序调用驱动程序的 DxgkDdiResetFromTimeout 函数&#xff0c;这将重置 GPU。 DxgkDdiResetFromTimeou…...

GEC6818蜂鸣器驱动开发

相关知识&#xff1a;Linux设备驱动开发 insmod 编译好的.ko文件后再运行beep_app.c编译完成的可执行文件即可使板子蜂鸣。 beep_drv.c: #include <linux/module.h> //包含了加载模块时需要使用的大量符号和函数声明 #include <linux/kernel.h> //包含了printk内…...

WPF MVVM入门系列教程(五、命令和用户输入)

&#x1f9ed; WPF MVVM入门系列教程 一、MVVM模式介绍二、依赖属性三、数据绑定四、ViewModel五、命令和用户输入六、ViewModel案例演示 WPF中的命令模型 在WPF中&#xff0c;我们可以使用事件来响应鼠标和键盘动作。 但使用事件会具备一定的局限性&#xff0c;例如&#x…...

基于Jetson Nano与PyTorch的无人机实时目标跟踪系统搭建指南

引言&#xff1a;边缘计算赋能智能监控 在AIoT时代&#xff0c;将深度学习模型部署到嵌入式设备已成为行业刚需。本文将手把手指导读者在NVIDIA Jetson Nano&#xff08;4GB版本&#xff09;开发板上&#xff0c;构建基于YOLOv5SORT算法的实时目标跟踪系统&#xff0c;集成无人…...

创建简易个人关系图谱(Neo4j )

1. 启动 Neo4j 并进入 Neo4j Browser 确保 Neo4j 已启动&#xff0c;访问&#xff1a; http://localhost:7474/2. 创建人物节点&#xff08;Person&#xff09; (1) 创建 Alice CREATE (alice:Person {name: "Alice", age: 28, gender: "Female"}) RETUR…...

JavaScript 到命令和控制 (C2) 服务器恶意软件分析及防御

攻击始于一个经过混淆的JavaScript文件,该文件从开源服务中获取编码字符串以执行PowerShell脚本。然后,该脚本从一个IP地址和一个URL缩短器下载一个JPG图像和一个文本文件,这两个文件都包含使用隐写术嵌入的恶意MZ DOS可执行文件。这些有效载荷一旦执行,就会部署Stealer恶意…...

[原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何自动打开“安全性与隐私“控制面板?

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...

springboot微服务连接nacos超时

问题现象 java应用启动失败&#xff0c;查看日志&#xff0c;发现是连接Nacos超时&#xff0c;获取不到配置&#xff0c;导致dubbo注册失败&#xff0c;错误日志如下&#xff1a; 2025-05-01 14:50:08.973 ERROR [TW-172.29.245.61-9063-3] [com.alibaba.nacos.common.utils.…...

react-transition-group 在 React 18 及以上版本中的兼容性问题

出现问题 在React19中下载react-transition-group&#xff08;4.4.5&#xff09;&#xff0c;正常导入使用&#xff1a; 出现下述报错&#xff1a; 报错原因 React18开始&#xff0c;已废弃findDOMNode &#xff0c;而 react-transition-group 的 4.4.5 版本仍然使用了 findD…...