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

spring @Autowired对属性、set方法,构造器的分别使用,以及配合 @Autowired 和 @Qualifier避免歧义性的综合使用案例

代码结构

在这里插入图片描述

依赖注入

在Spring IoC容器的概念中,主要是使用依赖注入来实现Bean之间的依赖关系的

举例

例如,人类(Person)有时候会利用动物(Animal)来完成一些事情,狗(Dog)是用来看门的,猫(Cat)是用来抓老鼠的,鹦鹉(Parrot)是用来迎客的……于是人类做一些事情就依赖于那些可爱的动物了,如图
在这里插入图片描述
为了更好地展现这个过程,首先定义两个接口,一个是人类接口(Person),另一个是动物接口(Animal)。人类是通过动物来提供一些特殊服务的,如下代码

*人类接口

package com.burns.test.test1;/********人类接口********/
public interface Person {// 使用动物服务public void service();// 设置动物public void setAnimal(Animal animal);
}

动物接口

package com.burns.test.test1;/********动物接口********/public interface Animal {public void use();
}

这样我们就拥有了两个接口。我们还需要两个实现类,如代码

人类实现类

package com.burns.test.test1; /********人类实现类********/import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;/*** imports**/
@Component
public class BussinessPerson implements Person {@Autowiredprivate Animal animal = null;@Overridepublic void service() {this.animal.use();}@Overridepublic void setAnimal(Animal animal) {this.animal = animal;}
}

狗——动物实现类

package com.burns.test.test1; /********狗——动物实现类********/import org.springframework.stereotype.Component;/*** imports**/
@Component
public class Dog implements Animal {@Overridepublic void use() {System.out.println("狗【" + Dog.class.getSimpleName() + "】是看门用的。");}
}

注意,注解@Autowired也是Spring中最常用的注解之一,十分重要,它会按属性的类型找到对应的Bean进行注入。狗是动物的一种,所以IoC容器会把Dog实例注入BussinessPerson实例中。这样通过IoC容器获取BussinessPerson实例的时候就能够使用Dog实例来提供服务了,下面是测试的代码

配置类-AppConfig

package com.burns.test.test1;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan
public class AppConfig {
}

测试入口类-MainTest

package com.burns.test.test1;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class MainTest {public static void main(String[] args) {// 使用配置文件AppConfig.java创建IoC容器AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);try {Person person = ctx.getBean(BussinessPerson.class);person.service();} finally {// 关闭IoC容器ctx.close();}}
}

执行结果

狗【Dog】是看门用的。

15:47:09.330 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext -- Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6108b2d7
15:47:09.355 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory -- Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
15:47:09.434 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner -- Identified candidate component class: file [D:\workspace\idea_proj\springboot3-demo\target\classes\com\burns\test\test1\BussinessPerson.class]
15:47:09.435 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner -- Identified candidate component class: file [D:\workspace\idea_proj\springboot3-demo\target\classes\com\burns\test\test1\Dog.class]
15:47:09.613 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory -- Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor'
15:47:09.619 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory -- Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'
15:47:09.622 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory -- Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
15:47:09.626 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory -- Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
15:47:09.638 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory -- Creating shared instance of singleton bean 'appConfig'
15:47:09.647 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory -- Creating shared instance of singleton bean 'bussinessPerson'
15:47:09.664 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory -- Creating shared instance of singleton bean 'dog'
狗【Dog】是看门用的。
15:47:09.707 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext -- Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@6108b2d7, started on Thu Mar 27 15:47:09 CST 2025

显然,测试是成功的,这个时候IoC容器已经通过注解@Autowired成功地将Dog实例注入了BussinessPerson实例中。但是,这只是一个比较简单的例子,我们有必要继续探讨@Autowired

注解@Autowired

@Autowired是Spring中使用得最多的注解之一,在本节中需要进一步地进行探讨。@Autowired的注入策略中最基本的一条是按类型,我们回顾IoC容器的顶级接口BeanFactory,就可以知道IoC容器是通过getBean()方法获取对应的Bean的,而getBean()方法又支持按名称或者按类型。再回到上面的例子,我们只是创建了一个动物——狗,而实际上动物还可以有猫(Cat),猫可以为我们抓老鼠,于是我们又创建了一个猫类,如代码

猫类-Cat

package com.burns.test.test1;import org.springframework.stereotype.Component;@Component
public class Cat implements Animal {@Overridepublic void use() {System.out.println("猫【" + Cat.class.getSimpleName() + "】是抓老鼠。");}
}

猫类创建完成了。如果我们还使用代码的BussinessPerson类,那么麻烦就来了,因为这个类只是定义了一个动物(Animal)属性,而我们却有两个动物——一只狗和一只猫,IoC容器如何注入呢?如果重新进行测试,很快就可以看到IoC容器抛出异常,如下面的日志所示:

No qualifying bean of type 'com.burns.test.test1.Animal' available: expected single matching bean but found 2: cat,dog
15:54:50.783 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext -- Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6108b2d7
15:54:50.809 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory -- Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
15:54:50.889 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner -- Identified candidate component class: file [D:\workspace\idea_proj\springboot3-demo\target\classes\com\burns\test\test1\BussinessPerson.class]
15:54:50.890 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner -- Identified candidate component class: file [D:\workspace\idea_proj\springboot3-demo\target\classes\com\burns\test\test1\Cat.class]
15:54:50.891 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner -- Identified candidate component class: file [D:\workspace\idea_proj\springboot3-demo\target\classes\com\burns\test\test1\Dog.class]
15:54:51.074 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory -- Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor'
15:54:51.080 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory -- Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'
15:54:51.082 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory -- Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
15:54:51.086 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory -- Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
15:54:51.105 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory -- Creating shared instance of singleton bean 'appConfig'
15:54:51.114 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory -- Creating shared instance of singleton bean 'bussinessPerson'
15:54:51.143 [main] WARN org.springframework.context.annotation.AnnotationConfigApplicationContext -- Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bussinessPerson': Unsatisfied dependency expressed through field 'animal': No qualifying bean of type 'com.burns.test.test1.Animal' available: expected single matching bean but found 2: cat,dog
Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bussinessPerson': Unsatisfied dependency expressed through field 'animal': No qualifying bean of type 'com.burns.test.test1.Animal' available: expected single matching bean but found 2: cat,dogat org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:767)at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:747)at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:145)at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:492)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1416)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:597)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520)at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973)at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:950)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:616)at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:93)at com.burns.test.test1.MainTest.main(MainTest.java:8)
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.burns.test.test1.Animal' available: expected single matching bean but found 2: cat,dogat org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:218)at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1395)at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1337)at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:764)... 15 more

从日志可以看出,IoC容器并不能知道你需要向BussinessPerson类对象注入什么动物(狗?猫?),从而引发错误。那么使用@Autowired能处理这个问题吗?答案是肯定的。假设我们目前需要让狗提供服务,可以把属性名称转化为dog,也就是把原来的

@Autowired
private Animal animal = null;
修改为
@Autowired
private Animal dog = null;
package com.burns.test.test1; /********人类实现类********/import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;/*** imports**/
@Component
public class BussinessPerson implements Person {@Autowiredprivate Animal dog = null;@Overridepublic void service() {this.dog.use();}@Overridepublic void setDog(Animal dog) {this.dog = dog;}
}

在上述代码中,我们只是将属性的名称从animal修改为了dog,再次测试时,可以看到是采用狗来提供服务的。这是因为Autowired提供以下规则:按类型找到对应的Bean,如果对应类型的Bean不是唯一的,那么它会根据其属性名称和Bean的名称进行匹配。如果匹配得上,就会使用该Bean;如果还无法匹配,就会抛出异常。

15:59:29.526 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory -- Creating shared instance of singleton bean 'cat'
狗【Dog】是看门用的。
15:59:29.572 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext -- Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@6108b2d7, started on Thu Mar 27 15:59:29 CST 2025

注意,@Autowired是一个默认必须找到对应Bean的注解,如果不能确定其标注属性一定会存在并且允许这个被标注的属性为null,那么可以配置@Autowired的required属性为false,例如:

@Autowired(required = false)

当然,在大部分情况下,我都不推荐这样做,因为这样极其容易抛出“臭名昭著”的空指针异常(NullPointerException)。同样,它除了可以标注属性,还可以标注方法,如setAnimal()方法

@Override
@Autowired
public void setAnimal(Animal animal) {
this.animal = animal;
}

注意,新版的Spring规范建议将@Autowired标注在setter()方法上。本书只是为了节省篇幅,将@Autowired标注在类的属性上。这样@Autowired也会使用setAnimal()方法从IoC容器中找到对应的动物进行注入 ,甚至我们还可以将@Autowired标注在方法的参数上

消除歧义性——@Primary和@Qualifier

歧义性问题

当既有猫又有狗的时候,为了使@Autowired能够继续使用,我们做了一个决定:将BussinessPerson的属性名称从animal修改为dog。显然这不是一个好的做法,因为这里并不限制使用什么动物,而声明的属性名称却成了狗。产生注入失败问题的根本原因是按类型查找,正如动物可以有多种类型,这会造成IoC容器依赖注入的困扰,我们把这样的问题称为歧义性。那么,@Primary和@Qualifier这两个注解是从哪个角度解决问题的呢?

@Primary

先来谈@Primary,它是一个修改优先权的注解,当既有猫、又有狗的时候,假设这次需要使用猫,那么只需要在猫类的定义上加入@Primary就可以了,类似下面这样:

package com.burns.test.test1;import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;@Component
@Primary
public class Cat implements Animal {@Overridepublic void use() {System.out.println("猫【" + Cat.class.getSimpleName() + "】是抓老鼠。");}
}

在上述代码中,@Primary告诉IoC容器:“当发现有多个同样类型的Bean时,请优先使用我进行注入。”于是再次进行测试时会发现,系统将用猫提供服务。当Spring进行注入的时候,虽然发现存在多个动物,但因为Cat被标注为@Primary,所以优先采用Cat实例进行注入,这样就通过优先级变换使得IoC容器知道注入哪个具体的实例来满足依赖注入。

16:09:28.346 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory -- Creating shared instance of singleton bean 'dog'
猫【Cat】是抓老鼠。
16:09:28.397 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext -- Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@6108b2d7, started on Thu Mar 27 16:09:27 CST 2025

@Qualifier

有时候@Primary也可以使用在多个类上,无论是猫是狗都可能带上注解@Primary,其结果是IoC容器还是无法区分采用哪个Bean的实例进行注入,因此我们需要更加灵活的机制来实现注入,Qualifier可以满足这个需求。@Qualifier的配置项value需要用一个字符串定义,它将与@Autowired组合在一起,通过名称和类型一起找到Bean。我们知道Bean名称在IoC容器中是唯一的标识,利用它就可以消除歧义性了。此时你是否想起了BeanFactory接口中的这个getBean()方法呢? T getBean(String name, lass requiredType) throws BeansException;使用getBean()方法就能够按名称和类型的组合找到Bean了。下面假设猫已经标注了Primary,而我们需要狗提供服务,因此需要修改ussinessPerson的animal属性的标注,以适应我们的需要:

package com.burns.test.test1; /********人类实现类********/import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;/*** imports**/
@Component
public class BussinessPerson implements Person {@Autowired@Qualifier("dog")private Animal animal = null;@Overridepublic void service() {this.animal.use();}@Overridepublic void setAnimal(Animal animal) {this.animal = animal;}
}

一旦这样声明,IoC容器将会按名称和类型来寻找对应的Bean进行依赖注入,显然也只能找到狗为我们服务了

带有参数的构造方法类的装配

上述场景都是在不带参数的构造方法下实现依赖注入。但事实上,有些类只有带有参数的构造方法,于是上述场景都不再适用了。为了对构造方法的参数进行依赖注入,我们可以使用注解Autowired。例如,修改类BussinessPerson来实现这个功能,如代码

package com.burns.test.test2;import com.burns.test.test1.Animal;
import com.burns.test.test1.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;/******** imports ********/
@Component
public class BussinessPerson implements Person {private Animal animal = null;public BussinessPerson(@Autowired @Qualifier("dog") Animal animal) {this.animal = animal;}@Overridepublic void service() {this.animal.use();}@Overridepublic void setAnimal(Animal animal) {this.animal = animal;}
}

代码取消了注解@Autowired对属性和方法的标注。注意,加粗的代码在方法的参数上加入了注解@Autowired和注解@Qualifier,使得参数能够注入进来。这里使用@Qualifier是为了按名称进行依赖注入,避免歧义性。当然,如果你的环境中不是既有猫、又有狗,完全可以不使用@Qualifier,只使用@Autowired就可以了。

相关文章:

spring @Autowired对属性、set方法,构造器的分别使用,以及配合 @Autowired 和 @Qualifier避免歧义性的综合使用案例

代码结构 依赖注入 在Spring IoC容器的概念中&#xff0c;主要是使用依赖注入来实现Bean之间的依赖关系的 举例 例如&#xff0c;人类&#xff08;Person&#xff09;有时候会利用动物&#xff08;Animal&#xff09;来完成一些事情&#xff0c;狗&#xff08;Dog&#xff0…...

Ubuntu 系统上完全卸载 Docker

以下是在 Ubuntu 系统上完全卸载 Docker 的分步指南 一.卸载验证 二.卸载步骤 1.停止 Docker 服务 sudo systemctl stop docker.socket sudo systemctl stop docker.service2.卸载 Docker 软件包 # 移除 Docker 核心组件 sudo apt-get purge -y \docker-ce \docker-ce-cli …...

国际机构Gartner发布2025年网络安全趋势

转自&#xff1a;中国新闻网 中新网北京3月14日电 国际机构高德纳(Gartner)14日发布的消息称&#xff0c;网络安全和风险管理在2025年“面临挑战与机遇并存的局面”&#xff0c;“实现转型和提高弹性”对确保企业在快速变化的数字世界中&#xff0c;实现安全且可持续的创新至关…...

设计秒杀系统(高并发的分布式系统)

学海无涯&#xff0c;志当存远。燃心砺志&#xff0c;奋进不辍。 愿诸君得此鸡汤&#xff0c;如沐春风&#xff0c;事业有成。 若觉此言甚善&#xff0c;烦请赐赞一枚&#xff0c;共励学途&#xff0c;同铸辉煌&#xff01; 思路 处理高并发 流量削峰&#xff1a;限流&#xf…...

C# 打印模板设计-ACTIVEX打印控件-多模板加载

一、启动软件 using System; using System.Collections.Generic; using System.Windows.Forms; using System.Data;namespace Print {static class Program{/// <summary>/// 应用程序的主入口点。/// </summary>[STAThread]static void Main(){//使用模板前必须…...

华为HCIE方向那么多应该如何选择?

在华为认证体系里&#xff0c;HCIE作为最高等级的认证&#xff0c;是ICT领域专业实力的有力象征。HCIE设置了多个细分方向&#xff0c;这些方向宛如不同的专业赛道&#xff0c;为期望在ICT行业深入发展的人提供了丰富的选择。今天&#xff0c;咱们就来好好聊聊华为HCIE方向的相…...

五子棋游戏

五子棋 - deveco <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>五子棋 - deveco</title>…...

Vue3.5 企业级管理系统实战(十):面包屑导航组件

1 breadcrumb 组件 1.1 安装插件 path-to-regexp 首先&#xff0c;我们需要安装插件 path-to-regexp&#xff0c;以便在下面的面包屑组件中对路由地址进行解析。 path-to-regexp是一个 JavaScript 库&#xff0c;可将路径字符串转化为正则表达式&#xff0c;广泛用于 Web 开发…...

【python】OpenCV—Hand Detection

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、参考6、其它手部检测和手势识别的方案 更多有趣的代码示例&#xff0c;可参考【Programming】 1、功能描述 基于 opencv-python 和 mediapipe 进行手部检测 2、代码实现 导入必要的库函数 import cv2 import media…...

[ComfyUI] SDXL Prompt Styler 自定义节点的作用解析

1. SDXL Prompt Styler 的位置与基本功能 在 ComfyUI 的 “新建节点” → “实用工具” 下,可以找到 Style 节点(SDXL Prompt Styler)。该节点的主要作用是对输入的描述进行结构化处理,并在转换为 Stable Diffusion XL (SDXL) 提示词时,自动补充风格相关的内容,使提示词…...

Oracle-rman restore遭遇RMAN-03002与ORA-19563

文章目录 在原DB上检查是否有重复的文件名&#xff1a;查看rman恢复的日志修正重名部分重新执行rman恢复结论&#xff1a; 在 RMAN 恢复过程中&#xff0c;遇到RMAN-03002连同ORA-19563:错误。 操作是将 Oracle 10.0.5的数据库备份从 RMAN備份恢复到另一台测试主机的同一个目录…...

FPGA中串行执行方式之使用时钟分频或延迟的方式

FPGA中串行执行方式之使用时钟分频或延迟的方式 在FPGA设计中,​时钟分频和延迟是两种常用的技术,用于控制信号的时序或调整信号的频率。它们可以用来实现简单的串行逻辑、状态转移或其他需要时间控制的场景。 时钟分频(Clock Division) 基本原理:时钟分频是通过将输入…...

Dubbo 全面解析:从 RPC 核心到服务治理实践

一、分布式系统与 RPC 框架概述 在当今互联网时代&#xff0c;随着业务规模的不断扩大&#xff0c;单体架构已经无法满足高并发、高可用的需求&#xff0c;分布式系统架构成为主流选择。而在分布式系统中&#xff0c;远程服务调用&#xff08;Remote Procedure Call&#xff0…...

JavaScript 调试入门指南

JavaScript 调试入门指南 一、调试准备阶段 1. 必备工具配置 浏览器套件:安装最新Chrome102+,开启实验性功能(地址栏输入chrome://flags/#enable-devtools-experiments)编辑器集成:VS Code安装以下扩展: JavaScript Debugger:支持浏览器与Node.js双端调试Error Lens:实…...

不能将下载行为传输到IDM

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 安装IDM后&#xff0c;调用IDM下载软件显示&#xff1a;不能将下载行为传输到IDM&#xff0c;Error 0x80029C4A 二、原因分析 可能是识别浏览器插件不到&#xff0c;或者本地的插件版本不对导致的 三…...

spring security 认证流程分析

Spring Security 认证流程分析 Spring Security 的认证流程是一个模块化且可扩展的过程&#xff0c;核心围绕 过滤器链 和 认证组件 协作实现。以下是详细流程分析&#xff1a; 1. 请求拦截与过滤器链 • 入口&#xff1a;所有 HTTP 请求经过 Spring Security 的过滤器链。 •…...

Docker Compose 部署 Loki

官方文档&#xff1a;https://grafana.com/docs/loki/latest/setup/install/docker/ 环境准备 安装 Docker和Docker Compose 参考&#xff1a;https://qiangsh.blog.csdn.net/article/details/125375187 创建loki目录 mkdir -p /opt/loki/config mkdir -p /data/monitoring…...

nuxt3 seo优化

在 Nuxt3 中&#xff0c;通过 nuxtjs/seo、nuxtjs/sitemap 和 nuxtjs/robots 模块可以生成包含动态链接的站点地图&#xff08;sitemap.xml&#xff09;&#xff0c;但具体是“实时生成”还是“部署时生成”&#xff0c;取决于你的配置方式和数据更新频率。以下是具体分析&…...

CentOS 8 Stream 配置在线yum源参考 —— 筑梦之路

CentOS 8 Stream ISO 文件下载地址&#xff1a;http://mirrors.aliyun.com/centos-vault/8-stream/isos/x86_64/CentOS-Stream-8-20240603.0-x86_64-dvd1.isoCentOS 8 Stream 网络引导ISO 文件下载地址&#xff1a;http://mirrors.aliyun.com/centos-vault/8-stream/isos/x86_6…...

uniapp 在app上 字体如何不跟着系统字体大小变

在UniApp开发中&#xff0c;默认情况下App的字体可能会跟随系统字体设置而变化。如果你希望保持固定的字体样式&#xff0c;不随系统字体设置改变&#xff0c;可以采用以下几种方法&#xff1a; 方法一&#xff1a;全局CSS设置 在App.vue的样式中添加以下CSS&#xff1a; /*…...

leetcode141.环形链表

直接快慢指针&#xff0c;如果有环&#xff0c;那么快指针一定会在成环的起始点与慢指针相遇 /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ pu…...

【HTML5游戏开发教程】零基础入门合成大西瓜游戏实战 | JS物理引擎+Canvas动画+完整源码详解

《从咖啡杯到财务自由&#xff1a;一个程序员的合成之旅——当代码遇上物理引擎的匠心之作》 &#x1f31f; 这是小游戏开发系列的第四篇送福利文章&#xff0c;感谢一路以来支持和关注这个项目的每一位朋友&#xff01; &#x1f4a1; 文章力求严谨&#xff0c;但难免有疏漏之…...

【C#语言】深入理解C#多线程编程:从基础到高性能实践

文章目录 ⭐前言⭐一、多线程的本质价值&#x1f31f;1、现代计算需求&#x1f31f;2、C#线程演进史 ⭐二、线程实现方案对比&#x1f31f;1、传统线程模型&#x1f31f;2、现代任务模型&#xff08;推荐&#xff09;&#x1f31f;3、异步编程范式 ⭐三、线程安全深度解析&…...

短信验证码安全需求设计

背景&#xff1a; 近期发现部分系统再短信充值频繁&#xff0c;发现存在恶意消耗短信额度现象&#xff0c;数据库表排查&#xff0c;发现大量非合法用户非法调用短信接口API导致额度耗尽。由于系统当初设计存在安全缺陷&#xff0c;故被不法分子进行利用&#xff0c;造成损失。…...

selenium实现自动登录项目(5)

1、163邮箱自动登录功能 遇到的问题&#xff1a; 1、登录页面&#xff0c;在定位表单时候&#xff0c;采用id&#xff0c;xpath&#xff0c;css selector都无法定位成功&#xff0c;因为id后面有个随机生成的数字&#xff08;//*[id"x-URS-iframe1741925838640.6785&quo…...

多 线 程

一.基本知识 线程&#xff1a;线程是操作系统能够运行调度的最小单位 进程&#xff1a;进程是程序执行实体 多线程应用场景&#xff1a;拷贝、迁移大文件&#xff0c;加载大量的资源文件 并发&#xff1a;有多个指令在单个cpu上交替执行 并行&#xff1a;在同一时刻人&…...

C#:类型定义中使用‌问号(?)

在 C# 中&#xff0c;类型定义中的‌问号&#xff08;?&#xff09;‌主要用于控制类型的可空性&#xff0c;但具体行为因类型&#xff08;值类型或引用类型&#xff09;和 C# 版本而异。以下是清晰分类的说明&#xff1a; 一、可空值类型&#xff08;T?&#xff0c;适用于所…...

基于飞腾FT2000+服务器主板与DeepSeek大模型的国产化AI算力探索

随着国产化处理器和AI技术的快速发展&#xff0c;自主可控的算力解决方案日益受到关注。国内大模型技术飞速发展&#xff0c;Deepseek等大模型在自然语言处理、计算机视觉等领域展现出强大的能力。面对大模型的计算需求&#xff0c;服务器硬件的国产化成为重要趋势。 飞腾FT20…...

知识篇 | Oracle的 TEMP表空间管理和优化

Oracle临时表空间&#xff08;TEMP&#xff09;是数据库中用于存储会话级临时数据的核心组件&#xff0c;主要用于支持需要中间结果集的操作&#xff08;如排序、哈希连接&#xff09;。其数据在事务结束或会话终止后自动释放&#xff0c;不持久化存储。 核心特点&#xff1a;…...

鸿蒙进行视频上传,使用 request.uploadFile方法

一.拉起选择器进行视频选择&#xff0c;并且创建文件名称 async getPictureFromAlbum() {// 拉起相册&#xff0c;选择图片let PhotoSelectOptions new photoAccessHelper.PhotoSelectOptions();PhotoSelectOptions.MIMEType photoAccessHelper.PhotoViewMIMETypes.VIDEO_TY…...

如何下载 Postman?快速指南!

Postman 是一款非常受欢迎的 API 测试工具。它最初是作为一个 Chrome 插件发布&#xff0c;后来发展成为一款独立的跨平台软件&#xff0c;支持 Windows、Mac、Linux 等操作系统。 Postman 怎么下载教程&#xff08;2025最新版&#xff09;&#xff1f;...

Angular由一个bug说起之十五:自定义基于Overlay的Tooltip

背景 工具提示&#xff08;tooltip&#xff09;是一个常见的 UI 组件&#xff0c;用于在用户与页面元素交互时提供额外的信息。由于angular/material/tooltip的matTooltip只能显示纯文本&#xff0c;所以我们可以通过自定义Directive来实现一个灵活且功能丰富的tooltip Overlay…...

M系mac怎么关闭sip

SIP是系统级的权限操作&#xff0c;我们无法直接关闭它。记录一下如何成功关闭SIP。 一. 查看自己mac的sip是否关闭&#xff0c;终端中输入该下命令&#xff1a; csrutil status 未关闭&#xff1a;System Integrity Protection status: enabled. 已关闭&#xff1a;System…...

Kafka 的延迟队列、死信队列和重试队列

总结一下实现的方法&#xff1a; 1、延迟队列&#xff0c;首先kafka是没有延迟队列的&#xff0c;那要实现延迟队列的话&#xff0c;就得使用其他方法。在发送消息的时候加上时间戳&#xff0c;再在时间戳上面加上延迟时间。消费的时候判断一下&#xff0c;有没有到达延迟时间&…...

OpenCV正确安装及环境变量配置

安装OpenCV&#xff08;v4.6.0&#xff09;安装Python&#xff08;3.10.6&#xff09;安装VS2022的C桌面开发&#xff0c;手动勾选Windows 10 SDK和MSVC安装CMake&#xff08;3.31.6&#xff09;在.npmrc配置pnpm config set auto-approve-builds true运行pnpm install 接下来是…...

分布式系统的CAP理论、事务和锁实现

分布式系统核心概念 1. CAP理论 CAP理论指出&#xff0c;分布式系统最多同时满足以下三项中的两项&#xff1a; 一致性&#xff08;CC&#xff09;&#xff1a;所有节点访问同一份最新数据。可用性&#xff08;AA&#xff09;&#xff1a;每个请求都能在合理时间内获得非错误…...

JBDev - Theos下一代越狱开发工具

JBDev - Theos下一代越狱开发工具 自越狱诞生以来&#xff0c;Theos一直是越狱开发的主流工具&#xff0c;大多数开发者使用Theos编译代码&#xff0c;再用lldb手动调试。JBDev简化了这个过程&#xff0c;项目地址https://github.com/lich4/JBDev 简介 JBDev用于Xcode越狱开…...

vue3自定义动态锚点列表,实现本页面锚点跳转效果

需求&#xff1a;当前页面存在多个模块且内容很长时&#xff0c;需要提供一个锚点列表&#xff0c;可以快速查看对应模块内容 实现步骤&#xff1a; 1.每个模块添加唯一id&#xff0c;添加锚点列表div <template><!-- 模块A --><div id"modalA">…...

华为、浪潮、华三链路聚合概述

1、华为 链路聚合可以提高链路带宽和链路冗余性。有三种类型&#xff0c;分别是手工链路聚合&#xff0c;静态lacp链路聚合&#xff0c;动态lacp链路聚合。 手工链路模式&#xff1a;也称负载分担模式&#xff0c;需手动指定链路&#xff0c;各链路之间平均分担流量。静态LAC…...

RUBY报告系统

我们常用GFP及其变体如RFP、YFP、mCherry等作为基因表达的报告蛋白——需要荧光显微镜制片观察&#xff1b;此外还有GUS或荧光素酶作为报告酶——需要添加底物。 RUBY报告系统则与众不同&#xff0c;其作用原理是&#xff1a;将酪氨酸转化为鲜艳的红色甜菜碱&#xff0c;无需使…...

HO与OH差异之Navigation三

在上一篇内容中我们介绍了HO与OH差异之Navigator&#xff0c;我们也了解了Navigator的基本概念和大致了解了一下他的基础用法&#xff0c;既然谈到差异肯定就不止这两种差异&#xff0c;今天就让我们来了解第三种差异NavRouter&#xff0c;其中在HO中我们并没有这种路由方式但是…...

PyTorch处理数据--Dataset和DataLoader

在 PyTorch 中&#xff0c;Dataset 和 DataLoader 是处理数据的核心工具。它们的作用是将数据高效地加载到模型中&#xff0c;支持批量处理、多线程加速和数据增强等功能。 一、Dataset&#xff1a;数据集的抽象‌ Dataset 是一个抽象类&#xff0c;用于表示数据集的接口。你…...

Linux搭建NFS服务

1.概述 Network File System的缩写&#xff0c;它最大的功能是可以通过网络使用挂载的方式&#xff0c;让不同的机器、不同的操作系统可以共享彼此的文件 2.名称 软件名 nfs-utils服务名 nfs或者nfs-server 3.端口 nfs-server tcp/2049 负责建立连接 rpcbind tcp/111 负责…...

ubuntu服务器server版安装,ssh远程连接xmanager管理,改ip网络连接。图文教程

ventoy启动服务器版iso镜像&#xff0c;注意看server名称&#xff0c;跟之前desktop版ubuntu不一样。没有gui界面。好&#xff0c;进入命令行界面。语言彻底没汉化了&#xff0c;选英文吧&#xff0c;别的更看不懂。 跟桌面版ubuntu类似&#xff0c;选择是否精简系统&#xff0…...

GC overhead limit exceeded---Java 虚拟机 (JVM) 在进行垃圾回收内存量非常少解决

背景&#xff1a; 我正在跑一个数据处理较为复杂的程序。然后调试了很多遍&#xff0c;出现了GC问题&#xff0c;如下图bug. GC overhead limit exceeded-这个bug错误通常表示 Java 虚拟机 (JVM) 在进行垃圾回收时花费了过多的时间&#xff0c;并且回收的内存量非常少。…...

Pytorch学习笔记(十二)Learning PyTorch - NLP from Scratch

这篇博客瞄准的是 pytorch 官方教程中 Learning PyTorch 章节的 NLP from Scratch 部分。 官网链接&#xff1a;https://pytorch.org/tutorials/intermediate/nlp_from_scratch_index.html 完整网盘链接: https://pan.baidu.com/s/1L9PVZ-KRDGVER-AJnXOvlQ?pwdaa2m 提取码: …...

学习日记0327

A cross-domain knowledge tracing model based on graph optimal transport 我们使用gnn来学习这些节点的特征。在此基础上&#xff0c;我们使用显式分布距离度量对齐来自两个不同域的特征向量&#xff0c;旨在最小化域差异&#xff0c;实现最大的跨域知识转移。 AEGOT-CDKT…...

Postman 下载文件指南:如何请求 Excel/PDF 文件?

在 Postman 中进行 Excel/PDF 文件的请求下载和导出&#xff0c;以下是简明的步骤&#xff0c;帮助你轻松完成任务。首先&#xff0c;我们将从新建接口开始&#xff0c;逐步引导你完成整个过程。 Postman 请求下载/导出 excel/pdf 文件教程...

【HTML】验证与调试工具

个人主页&#xff1a;Guiat 归属专栏&#xff1a;HTML CSS JavaScript 文章目录 1. HTML 验证工具概述1.1 验证的重要性1.2 常见 HTML 错误类型 2. W3C 验证服务2.1 W3C Markup Validation Service2.2 使用 W3C 验证器2.3 验证结果解读 3. 浏览器开发者工具3.1 Chrome DevTools…...

头歌实践教学平台--【数据库概论】--SQL

一、表结构与完整性约束的修改(ALTER) 1.修改表名 USE TestDb1; alter table your_table rename TO my_table; 2.添加与删除字段 #语句1&#xff1a;删除表orderDetail中的列orderDate alter table orderDetail drop orderDate; #语句2&#xff1a;添加列unitPrice alter t…...