Spring 提供了多种依赖注入的方式
- 构造器注入(Constructor Injection)
构造器注入是通过类的构造函数来注入依赖项。这是 Spring 推荐的方式,因为它提供了不可变性和更好的可测试性。
import org.springframework.stereotype.Component;@Component
public class ServiceA {public void doSomething() {System.out.println("ServiceA is doing something.");}
}@Component
public class ServiceB {private final ServiceA serviceA;public ServiceB(ServiceA serviceA) {this.serviceA = serviceA;}public void doSomethingElse() {serviceA.doSomething();System.out.println("ServiceB is doing something else.");}
}
- 字段注入(Field Injection)
字段注入是通过 @Autowired 注解直接注入到类的字段中。这种方式简洁,但不推荐用于生产代码,因为它降低了可测试性和可读性。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class ServiceA {public void doSomething() {System.out.println("ServiceA is doing something.");}
}@Component
public class ServiceB {@Autowiredprivate ServiceA serviceA;public void doSomethingElse() {serviceA.doSomething();System.out.println("ServiceB is doing something else.");}
}
- Setter 方法注入(Setter Injection)
Setter 方法注入是通过类的 setter 方法来注入依赖项。这种方式适用于需要动态更改依赖项的场景。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class ServiceA {public void doSomething() {System.out.println("ServiceA is doing something.");}
}@Component
public class ServiceB {private ServiceA serviceA;// 在 set 方法上需要添加 @Autowired 注解,告诉 Spring 这是一个注入点。@Autowiredpublic void setServiceA(ServiceA serviceA) {this.serviceA = serviceA;}public void doSomethingElse() {serviceA.doSomething();System.out.println("ServiceB is doing something else.");}
}
- 方法注入(Method Injection)
方法注入是通过任意方法来注入依赖项。这种方式类似于 Setter 注入,但可以用于任何方法。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class ServiceA {public void doSomething() {System.out.println("ServiceA is doing something.");}
}@Component
public class ServiceB {private ServiceA serviceA;@Autowiredpublic void initServiceA(ServiceA serviceA) {this.serviceA = serviceA;}public void doSomethingElse() {serviceA.doSomething();System.out.println("ServiceB is doing something else.");}
}
- 使用 @Bean 和 @Configuration 进行显式配置
在复杂的场景中,你可以使用 @Configuration 和 @Bean 注解来显式配置依赖项。这种方式提供了最大的灵活性。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic ServiceA serviceA() {return new ServiceA();}@Beanpublic ServiceB serviceB() {return new ServiceB(serviceA());}
}public class ServiceA {public void doSomething() {System.out.println("ServiceA is doing something.");}
}public class ServiceB {private final ServiceA serviceA;public ServiceB(ServiceA serviceA) {this.serviceA = serviceA;}public void doSomethingElse() {serviceA.doSomething();System.out.println("ServiceB is doing something else.");}
}
总结
构造器注入:推荐使用,提供了不可变性和更好的可测试性。
Setter 注入:适用于需要动态更改依赖项的场景。
字段注入:简洁但不推荐用于生产代码。
方法注入:类似于 Setter 注入,但更灵活。
接口注入:不常用,Spring 更倾向于使用注解和基于 Java 的配置。
显式配置:提供了最大的灵活性,适用于复杂场景。
选择哪种注入方式取决于具体的需求和场景。
在大多数情况下,构造器注入是最推荐的方式。
因为它更明确且能确保依赖在对象创建时就已准备好。
@Autowired 和 @Resource 是 Spring 框架中用于依赖注入的两个常用注解,它们在功能上有一定的相似性,但在实现细节和使用方式上存在显著区别。以下是它们的核心区别,帮助你根据具体需求做出选择:
1、来源与规范
@Autowired Spring 框架 Spring 专属
@Resource Java EE(JSR-250) 跨框架标准
- @Autowired 是 Spring 提供的注解,专为 Spring 生态系统设计。
- @Resource 是 Java EE 规范的一部分(javax.annotation.Resource),旨在实现跨框架的依赖注入。
- 默认注入策略
注解 默认注入方式 说明
@Autowired 按类型(by type) 根据依赖项的类型自动匹配。如果存在多个相同类型的 bean,会尝试按名称匹配。
@Resource 按名称(by name) 默认按字段名或属性名匹配 bean。如果没有指定名称,则使用变量名或方法名。 - @Autowired 优先按类型匹配,可能导致歧义(多个相同类型的 bean)。
- @Resource 优先按名称匹配,更直观且不易产生歧义。
- 依赖项名称的指定方式
注解 指定名称的方式
@Autowired 使用 @Qualifier 注解显式指定 bean 名称。
@Resource 直接通过 name 属性显式指定 bean 名称。
示例
java
// 使用 @Autowired + @Qualifier
@Autowired
@Qualifier(“specificService”)
private ServiceA serviceA;
// 使用 @Resource
@Resource(name = “specificService”)
private ServiceA serviceA;
@Autowired 需要额外使用 @Qualifier 注解来指定名称。
@Resource 直接通过 name 属性指定名称,更加简洁。
4. 注入位置的支持
注解 支持的注入位置
@Autowired 字段、构造函数、setter 方法、任意方法。
@Resource 字段、构造函数、setter 方法。
@Autowired 支持更广泛的注入位置,包括任意方法(例如初始化方法)。
@Resource 仅支持字段、构造函数和 setter 方法。
5. 必需性的默认行为
注解 默认必需性 修改方式
@Autowired 必需(必须存在依赖项) 通过 required = false 设置为非必需。
@Resource 必需(必须存在依赖项) 通过 lookup 或 mappedName 属性间接修改,但 Spring 中不常用。
@Autowired 默认要求依赖项必须存在,否则会抛出异常。可以通过 required = false 修改此行为。
@Resource 默认也要求依赖项必须存在,但修改必需性的方式不如 @Autowired 直观。
6. 适用场景与选择建议
选择 @Autowired 的场景
Spring 生态系统:项目完全基于 Spring 框架开发,且依赖 Spring 的其他功能。
按类型注入:需要按依赖项的类型自动匹配,且不介意可能存在的歧义(或通过 @Qualifier 解决)。
灵活性需求:需要在构造函数、setter 方法或任意方法中进行注入。
选择 @Resource 的场景
按名称注入:明确需要按 bean 的名称进行注入,避免歧义。
跨框架兼容性:项目可能迁移到其他框架(如 Jakarta EE),需要使用标准注解。
简洁性:希望减少注解数量,直接通过 name 属性指定依赖项。
7. 示例对比
@Autowired 示例
java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
public class ServiceA {
public void doSomething() {
System.out.println(“ServiceA is doing something.”);
}
}
@Component(“specificService”)
public class AnotherServiceA implements ServiceA {
@Override
public void doSomething() {
System.out.println(“AnotherServiceA is doing something.”);
}
}
@Component
public class ServiceB {
private final ServiceA serviceA;
@Autowired
@Qualifier("specificService") // 显式指定 bean 名称
public ServiceB(ServiceA serviceA) {this.serviceA = serviceA;
}public void doSomethingElse() {serviceA.doSomething();System.out.println("ServiceB is doing something else.");
}
}
@Resource 示例
java
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
@Component
public class ServiceA {
public void doSomething() {
System.out.println(“ServiceA is doing something.”);
}
}
@Component(“specificService”)
public class AnotherServiceA implements ServiceA {
@Override
public void doSomething() {
System.out.println(“AnotherServiceA is doing something.”);
}
}
@Component
public class ServiceB {
private final ServiceA serviceA;
@Resource(name = "specificService") // 直接指定 bean 名称
public ServiceB(ServiceA serviceA) {this.serviceA = serviceA;
}public void doSomethingElse() {serviceA.doSomething();System.out.println("ServiceB is doing something else.");
}
}
8. 总结
特性 @Autowired @Resource
来源 Spring 框架 Java EE 规范
默认注入策略 按类型(by type) 按名称(by name)
指定名称的方式 通过 @Qualifier 通过 name 属性
支持的注入位置 字段、构造函数、setter 方法、任意方法 字段、构造函数、setter 方法
必需性默认行为 必需,可通过 required = false 修改 必需,修改方式不直观
适用场景 Spring 生态系统、按类型注入、灵活性需求 按名称注入、跨框架兼容性、简洁性需求
最终建议
优先选择 @Autowired:
如果项目完全基于 Spring 框架。
需要按类型注入或更灵活的注入方式。
希望利用 Spring 生态系统的其他功能。
选择 @Resource:
如果需要按名称注入以避免歧义。
希望代码更具可移植性(不依赖于 Spring 特定注解)。
项目可能迁移到其他框架(如 Jakarta EE)。
通过理解两者的区别和适用场景,你可以根据项目需求做出更合理的选择。
在使用 @Autowired 进行依赖注入时,@Qualifier 注解用于解决依赖项的歧义问题。当 Spring 容器中存在多个相同类型的 bean 时,@Autowired 默认按类型注入会导致 Spring 无法确定应该注入哪个 bean。这时,@Qualifier 注解就派上用场,帮助明确指定要注入的 bean。
何时需要使用 @Qualifier
存在多个相同类型的 bean
如果你的应用程序中定义了多个相同类型的 bean,并且没有使用 @Primary 注解来指定一个默认的 bean,那么 Spring 无法确定应该注入哪个 bean。这时,你需要使用 @Qualifier 来明确指定要注入的 bean。
示例
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;public interface ServiceA {void doSomething();
}@Component("serviceA1")
public class ServiceAImpl1 implements ServiceA {@Overridepublic void doSomething() {System.out.println("ServiceAImpl1 is doing something.");}
}@Component("serviceA2")
public class ServiceAImpl2 implements ServiceA {@Overridepublic void doSomething() {System.out.println("ServiceAImpl2 is doing something.");}
}@Component
public class ServiceB {private final ServiceA serviceA;@Autowired@Qualifier("serviceA1") // 显式指定要注入的 bean 名称public ServiceB(ServiceA serviceA) {this.serviceA = serviceA;}public void doSomethingElse() {serviceA.doSomething();System.out.println("ServiceB is doing something else.");}
}
在这个示例中,ServiceA 接口有两个实现类 ServiceAImpl1 和 ServiceAImpl2。通过 @Qualifier(“serviceA1”),我们明确指定要注入 ServiceAImpl1 的实例。
需要动态选择 bean
在某些情况下,你可能需要根据不同的条件或配置动态选择要注入的 bean。虽然 @Qualifier 本身是静态的(在编译时确定),但你可以结合其他机制(如配置文件或环境变量)来动态选择 @Qualifier 的值。
与其他框架或库集成
当你的项目与其他框架或库集成时,这些框架或库可能会提供自己的 bean 实现。使用 @Qualifier 可以帮助你明确指定要使用哪个实现。
替代方案
@Primary 注解:如果你有一个默认的 bean 实现,可以使用 @Primary 注解来标记它。这样,在没有明确指定 @Qualifier 的情况下,Spring 会优先注入带有 @Primary 注解的 bean。
示例
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;@Component
@Primary
public class ServiceAImpl1 implements ServiceA {@Overridepublic void doSomething() {System.out.println("ServiceAImpl1 is doing something.");}
}@Component
public class ServiceAImpl2 implements ServiceA {@Overridepublic void doSomething() {System.out.println("ServiceAImpl2 is doing something.");}
}
在这个示例中,ServiceAImpl1 被标记为 @Primary,因此当没有使用 @Qualifier 时,Spring 会注入 ServiceAImpl1。
总结:
在 Spring 框架中,“相同类型的 bean” 指的是在 Spring 容器中存在多个实现了相同接口或继承了相同类的 bean 实例。这意味着这些 bean 属于同一个类型(即相同的接口或父类),Spring 无法仅通过类型来区分它们,从而在依赖注入时产生歧义。
使用 @Qualifier:当 Spring 容器中存在多个相同类型的 bean,并且你需要明确指定要注入的 bean 时。
使用 @Primary:当你希望指定一个默认的 bean 实现,以避免在大多数情况下需要使用 @Qualifier 时。
通过合理使用 @Qualifier 和 @Primary,你可以更灵活地管理 Spring 应用中的依赖注入,避免因 bean 歧义导致的注入问题。
相关文章:
Spring 提供了多种依赖注入的方式
构造器注入(Constructor Injection) 构造器注入是通过类的构造函数来注入依赖项。这是 Spring 推荐的方式,因为它提供了不可变性和更好的可测试性。 import org.springframework.stereotype.Component;Component public class ServiceA {pub…...
面经-计算机网络——OSI七层模型与TCP/IP四层模型的对比详解
OSI七层模型与TCP/IP四层模型的对比详解 一、图示解析:分层封装结构 你提供的图清晰展示了网络通信中从应用层到物理层的封装过程,每一层都会对上层的数据加上自己的头部信息(Header): 应用层: 应用…...
网络安全知识问答微信小程序的设计与实现
网络安全知识问答微信小程序的设计与实现,说白了,就是搭建一款网络安全知识问答微信小程序,类似网络安全百科直通车。三步走。 需求沟通 进行需求沟通,此处省略1000字。 画草图 根据沟通的需求,进行整理,…...
Canvas特效实例:黑客帝国-字母矩阵(字母雨)
黑客帝国-字幕矩阵(字母雨) 效果预览代码实现思路解析遗留问题 效果预览 话不多说,我们直接上效果:当页面加载完成,屏幕上会落下如瀑布般的绿色字母流,不断向下滑动,仿佛进入了黑客帝国的数字世…...
「Mac畅玩AIGC与多模态11」开发篇07 - 使用自定义名言插件开发智能体应用
一、概述 本篇介绍如何在 macOS 环境下,通过编写自定义 OpenAPI Schema,将无需认证的名言服务接入 Dify 平台,并开发基于外部公共数据的智能体应用。本案例继续实践 GET 请求型 API 的实际调用技巧。 二、环境准备 1. 确认本地开发环境 macOS 系统Dify 平台已部署并可访问…...
快速上手非关系型数据库-MongoDB
简介 MongoDB 是一个基于文档的 NoSQL 数据库,由 MongoDB Inc. 开发。 NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。 MongoDB 的设计理念是为了应对大数据量、…...
响应式布局,在飞帆平台中如此简单
这些控件都是可以自己动手去实现的。也可以将这些控件复制到自己名下进行修改。 响应式布局https://fvi.cn/782...
UN R79 关于车辆转向装置形式认证的统一规定(正文部分1)
UN R79法规是针对转向装置的型式认证法规,涉及A/B1/C类的横向控制辅助驾驶功能,对各功能的功能边界、性能要求、状态提示、故障警示以及型式认证要提交的信息做了规范,本文结合百度文心一言对法规进行翻译,并结合个人理解对部分内…...
深度学习系统学习系列【1】之基本知识
文章目录 说明基础知识人工智能、机器学习、深度学习的关系机器学习传统机器学习的缺陷选择深度学习的原因深度学习的关键问题深度学习的应用深度学习的加速硬件GPU环境搭建主流深度学习框架对比 说明 文章属于个人学习笔记内容,仅供学习和交流。内容参考深度学习原…...
python3GUI--视频监控管理平台 By:PyQt5(详细讲解)
文章目录 一.前言二.相关知识1.PyQt52.RTSP协议📌 简介:🧩 特点:📡 工作方式: 2. **RTMP(Real-Time Messaging Protocol)**📌 简介:&a…...
第十一届蓝桥杯 2020 C/C++组 既约分数
目录 题目: 题目描述: 题目链接: 思路: 核心思路: 思路详解: 代码: 代码详解: 题目: 题目描述: 题目链接: 既约分数 - 蓝桥云课 思路&a…...
如何让Steam下载速度解除封印?!
平时一直没注意到家里的路由器在偷懒。最近成功榨干家里的带宽,把平时一直20mb/s左右下载速度的路由器一番改造后成功steam下载速度稳定85Mb/s。平时一直都只发挥了他的1/3不到,真是太可惜了。 硬件 首先检查硬件,就千兆路由器而言…...
HOOK上瘾思维模型——AI与思维模型【88】
一、定义 HOOK上瘾思维模型是一种通过设计一系列的触发(Trigger)、行动(Action)、奖励(Reward)和投入(Investment)环节,来促使用户形成习惯并持续使用产品或服务的思维框…...
基于开源AI智能名片链动2+1模式S2B2C商城小程序的IP开发泡沫破局与价值重构研究
摘要:当前IP开发领域普遍存在"冒进式泡沫"现象,企业将初级IP包装为超级IP运营,导致资源错配与价值虚化。本文通过实证分析开源AI智能名片链动21模式S2B2C商城小程序的技术架构与商业逻辑,揭示其通过智能内容引擎、合规化…...
深⼊理解指针(8)
1.对上一篇的补充内容 typedef int* ptr_t #define PTR_T int* 这两种写法都是可以的 ptr_t p1, p2; //p1, p2 都是指针变量 PTR_T p3, p4; //p3 是指针变量, p4是整型变量 为什么p3 是指针变量, p4是整型变量呢? 因为PTR_T 真的被改为了 int* 在编译器中…...
【iview】icon样式
A. 工程中引入样式文件 iview源码工程中的example工程中如何引入iview样式 image.png 自定义工程中如何引入iview样式 一般在src/main.js中引入(在index.html中也可以,当然app.vue中也可以) import "iview/dist/styles/iview.css"B…...
【计算机视觉】三维视觉:Nerfstudio:模块化神经辐射场框架的技术突破与实战指南
深度解析Nerfstudio:模块化神经辐射场框架的技术突破与实战指南 技术架构与核心创新系统架构设计关键技术特性 环境配置与安装指南硬件要求全平台安装流程 实战全流程解析1. 数据采集与预处理2. 模型训练与优化3. 可视化与导出 核心技术深度解析1. 混合表示网络2. 渐…...
第二章 OpenCV篇-图像阈值的综合操作-Python
目录 一.图像阈值 二.图像平滑 1.均值滤波 2.方框滤波 3.高斯滤波 4.中值滤波 5.双边滤波 此章节主要讲解:图像阈值、图像平滑处理、均值滤波、方框滤波、高斯滤波、中值滤波、双边滤波。 这里先讲作者使用matplotlib模块出现错误的解决方法。 首先作者在这…...
WPF处理大规模激光数据计算与安全传输处理
WPF大规模激光数据处理与安全传输系统设计方案 一、系统架构设计 1. 整体架构 ┌─────────────────────────────────────────────┐ │ WPF客户端应用 │ ├───────────────┬…...
vue 常见ui库对比(element、ant、antV等)
Element UI 1. 简介 Element UI 是一个基于 Vue 2 和 Vue 3 的企业级 UI 组件库,提供了丰富的组件和主题定制功能。官方网站:Element UI 2. 主要特点 丰富的组件:包括表单、表格、布局、导航、弹窗等多种组件。主题定制:支持主…...
【c++】【STL】stack详解
目录 stack类的作用什么是容器适配器stack的接口构造函数emptysizetoppushpopswap关系运算符重载 stack类的实现 stack类的作用 stack是stl库提供的一种容器适配器,也就是我们数据结构中学到的栈,是非常常用的数据结构,特点是遵循LIFO&#…...
单片机-89C51部分:12 pwm 呼吸灯 直流电机
飞书文档https://x509p6c8to.feishu.cn/wiki/JkzfwSoFBiUKc4kh8IoccTfyndg 一、什么是PWM? PWM是脉冲宽度调制的缩写,它是一种通过调整脉冲信号的高电平和低电平时间比例来控制电路输出的技术。简单来说,PWM是一种控制电子设备输出电压或电…...
WPF实现数据库操作与日志记录
1. 数据库操作实现 1.1 数据库连接基类 public abstract class DatabaseBase : IDisposable {protected string ConnectionString { get; }protected IDbConnection Connection { get; private set; }protected DatabaseBase(string connectionString){ConnectionString = co…...
用spring-boot-maven-plugin打包成单个jar有哪些缺点优化方案
Spring Boot 的 Fat JAR(通过 spring-boot-maven-plugin 打包)虽然简化了部署,但也存在一些潜在缺点,需根据场景权衡: 1. 启动速度较慢 原因: Fat JAR 需要在启动时解压并加载所有依赖的 JAR 文件到类路径…...
Spring Boot 使用 WebMagic 爬虫框架入门
1. 创建 Spring Boot 项目 使用 Spring Initializr 创建一个 Spring Boot 项目,选择需要的依赖,如 Spring Web 等。 2. 添加 WebMagic 依赖 在项目的 pom.xml 文件中添加 WebMagic 的核心和扩展依赖: <dependency><groupId>u…...
【软件设计师:复习】上午题核心知识点总结(二)
一、计算机网络(常考) 1.网络模型与协议(必考) 1.OSI七层模型 vs. TCP/IP四层模型 OSI七层TCP/IP四层核心协议/设备功能应用层(Application)应用层HTTP、FTP、DNS、SMTP提供用户接口和服务表示层(Presentation)SSL/TLS、JPEG、ASCII数据格式转换、加密/解密会话层(S…...
TensorRt10学习第一章
建立TensorRt时必须要有Public ILogger,因为createInferBuiler和createruntime要用,是一个接口 出错打印 和...
【LeetCode Hot100】回溯篇
前言 本文用于整理LeetCode Hot100中题目解答,因题目比较简单且更多是为了面试快速写出正确思路,只做简单题意解读和一句话题解方便记忆。但代码会全部给出,方便大家整理代码思路。 46. 全排列 一句话题意 给定一个无重复数字的序列…...
Go 语言中一个功能强大且广泛使用的数据验证库github.com/go-playground/validator/v10
github.com/go-playground/validator/v10 是 Go 语言中一个功能强大且广泛使用的数据验证库,主要用于对结构体字段进行数据校验,确保数据的合法性和完整性。以下是其核心作用、使用场景及代码案例的详细说明: 核心作用 数据校验 支持对结构体…...
Java 多线程进阶:线程安全、synchronized、死锁、wait/notify 全解析(含代码示例)
在 Java 并发编程中,“线程安全” 是核心议题之一。本文将深入讲解线程安全的实现手段、synchronized 的使用方式、可重入锁、死锁的成因与避免、wait/notify 通信机制等,并配合实际代码案例,帮助你彻底搞懂 Java 线程协作机制。 一、线程安全…...
windows电脑端SSH连接开termux的安卓端
(确保你此前已经安装好了ssh)在手机termux当中输入: 查看状态:ssh 启动服务:sshd 查看IP:ifconfig 然后在电脑端:...
Java 期中考试练习题
一、引言 Java 作为一门广泛应用的编程语言,在计算机相关专业的课程体系中占据重要地位。期中考试是检验同学们对 Java 知识掌握程度的重要环节。本文将呈现一些典型的 Java 期中考试试题,并进行详细讲解,希望能帮助大家更好地理解和掌握 Ja…...
【Unity】 组件库分类详解
1️⃣ Audio(音频组件) 用于处理游戏中的声音。 Audio Source 读音[ˈɔːdiəʊ ˈsɔːs],音频源组件,用于播放音频文件,可设置音量、Pitch、循环播放等属性,是音频播放的核心组件。 Audio Listener 读音…...
Java 中使用正则表达式
1. 引入包 在使用正则表达式之前,需要引入包: import java.util.regex.Matcher; import java.util.regex.Pattern; 2. 常用模式规则 元字符 :这些是正则表达式中的特殊字符,用于匹配特定的模式。 . :匹配任意单个字…...
如何降低LabVIEW开发费用
在 LabVIEW 开发过程中,开发费用是用户和开发者共同关注的重点。过高的开发成本可能会压缩项目利润空间,甚至影响项目的可行性。下面将介绍降低 LabVIEW 开发费用的有效方法。 合理规划项目需求,避免后期增加 在项目启动阶段ÿ…...
WPF使用SQLSugar和Nlog
WPF应用中使用SQLSugar和NLog实现数据库操作与日志记录 1. 准备工作 首先,通过NuGet安装必要的包: Install-Package SQLSugarCore Install-Package NLog Install-Package NLog.Config Install-Package NLog.Targets.File 2. 配置NLog 在项目中添加nlog.config文件: <…...
Python10天冲刺-设计模型之策略模式
策略模式是一种行为设计模式,它允许你在运行时动态地改变对象的行为。这种模式的核心思想是将一组相关的算法封装在一起,并让它们相互替换。 下面是使用 Python 实现策略模式的一个示例: 示例代码 假设我们有一个简单的购物车系统…...
Js扩展DOM、BOM、AJAX、事件、定时器
BOM 操作 BOM指的是浏览器对象模型:Browser Object Mode,通过操作 window 对象的属性和方法来实现与浏览器的交互。 BOM的构成如下图所示: 其中,window对象是顶级对象,在 window 对象下面有一些重要的属性࿱…...
奥地利学派方法论的三个基础
主观价值论: 一切估价行为皆来自于个人,价格现象只能从主观估价中得到解释。 个人只在边际上做决策,边际价值是递减的。 罗斯巴德的等式:三个单位的某个东西的总效用 > 两个单位的总效用 > 一个单位的总效用,但…...
WPF之Image控件详解
文章目录 1. 概述2. Image控件的基本属性2.1 Source属性2.2 Stretch属性2.3 StretchDirection属性 3. 在XAML中使用Image控件3.1 基本用法3.2 设置拉伸模式3.3 设置图像对齐方式 4. 在代码中操作Image控件4.1 加载本地图像4.2 异步加载图像4.3 从流中加载图像4.4 控制图像的解码…...
如何将 VS Code 与 Linux 系统高效连接:从入门到进阶
引言 无论是开发服务器应用、管理远程主机,还是在本地 Linux 环境中提升开发效率,Visual Studio Code(VS Code) 凭借其强大的扩展能力,成为连接 Linux 系统的利器。本文将详细介绍 三种主流方法,助你无缝对…...
Matlab/Simulink - BLDC直流无刷电机仿真基础教程(五) - animateRotorPosition脚本讲解与使用
Matlab/Simulink - BLDC直流无刷电机仿真基础教程(五) - animateRotorPosition脚本讲解与使用 前言一、animateRotorPosition脚本内容二、脚本功能讲解三、脚本修改与模型配置四、可视化效果展示五、修改后脚本内容文章相关模型文件下载链接参考链接 前言…...
安川机器人常见故障报警及解决办法
机器人权限设置 操作权限设置(如果密码不对,就证明密码被人修改) 编辑模式密码:无(一把钥匙,默认) 管理模式密码:999999999(9个9,二把钥匙) 安全模式密码:555555555(9个5,三把钥匙,权限最高,有的型号机器人,没有此模式,但最高密码为安全模式密码) 示教器…...
【Quest开发】极简版!透视环境下抠出身体并能遮挡身体上的服装
前两天发了一个很复杂的版本,又鼓捣了一下发现完全没有必要。我之前的理解有点偏(不是错误的但用法错了),但是有一些小伙伴收藏了,害怕里面的某些东西对谁有用,所以写了一篇新的,前两步配置环境…...
【Github仓库】Learn-Vim随笔
一、前言 学习vim的过程中发现了很多很好的资源,其中不乏bilibili上up主的精品教程。也在YouTube上看过很多教程。但Learn-Vim这个Github仓库实在让我受益良多。 本笔记便是出于此仓库: 仓库地址 附上个人.vimrc配置文件: syntax on " 开启语法高…...
【2025五一数学建模竞赛C题】社交媒体平台用户分析问题|建模过程+完整代码论文全解全析
你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的美赛O奖、国赛国一的数学建模团队,我们将为你带来本次数学建模竞赛的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解析,…...
Wireshark抓取SMTP协议报文
文章目录 1. 实验:网络仿真软件使用及网络分析2. SMTP协议2.1 SMTP协议简介2.2 SMTP协议的核心功能2.3 SMTP的相关命令和作用 3. Wireshark抓取报文3.1 抓取SMTP协议报文流程3.1.1 Email邮件服务器背景3.1.2 具体实现流程 3.2 过滤SMTP协议相关报文 4. 协议时序图4.…...
PS学习笔记(一)
课程地址:【B站第一!】央美大佬198小时讲完的PS教程,全程干货无废话!学完秒变大神!还学不会,我不教设计了!!_哔哩哔哩_bilibili 第一章:基础知识 1.PS认识 一、PS应用领…...
部署.NET6.0 Web API项目到Docker
文章目录 介绍创建.NET WebAPI项目项目打包项目部署文件准备部署命令可能的问题与解决 介绍 使用VS2022创建一个.NET6的Web API项目,将其打包,并部署到Linux服务器上的Docker中。 Linux和Docker环境已经备好,本文不再赘述,主要记…...
前端函数防抖(Debounce)完整讲解 - 从原理、应用到完整实现
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战 🌺《RabbitMQ》…...