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

@Inject @Qualifier @Named

@Inject @Qualifier @Named

在依赖注入(DI)中,@Inject@Qualifier@Named 是用于管理对象创建和绑定的关键注解。以下是它们的用途、依赖配置和代码示例的详细说明:


1. 注解的作用

  • @Inject:标记需要注入的构造函数、字段或方法(JSR-330 标准)。
  • @Qualifier:定义自定义注解,用于解决同一类型多个实现的依赖冲突。
  • @Named:基于字符串名称的限定符(@Qualifier 的简化版),直接用于区分实现。

2. 依赖配置

Maven (pom.xml) - 使用 javax.inject(传统 Java EE)
<dependency><groupId>javax.inject</groupId><artifactId>javax.inject</artifactId><version>1</version>
</dependency>
Maven (pom.xml) - 使用 Jakarta EE
<dependency><groupId>jakarta.inject</groupId><artifactId>jakarta.inject-api</artifactId><version>2.0.1</version>
</dependency>
Gradle (build.gradle.kts) - Kotlin DSL
dependencies {// Java EEimplementation("javax.inject:javax.inject:1")// 或 Jakarta EEimplementation("jakarta.inject:jakarta.inject-api:2.0.1")
}

3. 代码示例

场景:多个 Service 实现,需通过名称或限定符区分
步骤 1:定义接口和实现类
public interface Service {void execute();
}// 实现类 1
public class EmailService implements Service {@Overridepublic void execute() {System.out.println("Sending email...");}
}// 实现类 2
public class SmsService implements Service {@Overridepublic void execute() {System.out.println("Sending SMS...");}
}
步骤 2:使用 @Named 注解区分实现
import javax.inject.Inject;
import javax.inject.Named;public class Client {private final Service service;// 通过名称注入特定实现@Injectpublic Client(@Named("email") Service service) {this.service = service;}public void run() {service.execute();}
}
步骤 3:配置依赖注入框架(以 Dagger 2 为例)
  1. 添加 Dagger 依赖

    <!-- Maven -->
    <dependency><groupId>com.google.dagger</groupId><artifactId>dagger</artifactId><version>2.50</version>
    </dependency>
    <dependency><groupId>com.google.dagger</groupId><artifactId>dagger-compiler</artifactId><version>2.50</version><scope>provided</scope>
    </dependency>
    
    // Gradle
    dependencies {implementation("com.google.dagger:dagger:2.50")kapt("com.google.dagger:dagger-compiler:2.50")
    }
    
  2. 定义模块和绑定

    import dagger.Module;
    import dagger.Provides;
    import javax.inject.Named;@Module
    public class AppModule {@Provides@Named("email")Service provideEmailService() {return new EmailService();}@Provides@Named("sms")Service provideSmsService() {return new SmsService();}
    }
    
  3. 创建组件并注入

    import dagger.Component;@Component(modules = AppModule.class)
    public interface AppComponent {Client getClient();
    }// 使用
    public class Main {public static void main(String[] args) {AppComponent component = DaggerAppComponent.create();Client client = component.getClient();client.run(); // 输出: Sending email...}
    }
    
步骤 4:自定义 @Qualifier(替代 @Named
  1. 定义自定义限定符注解

    import javax.inject.Qualifier;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;@Qualifier
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Email {}@Qualifier
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Sms {}
    
  2. 在模块中使用自定义限定符

    @Module
    public class AppModule {@Provides@EmailService provideEmailService() {return new EmailService();}@Provides@SmsService provideSmsService() {return new SmsService();}
    }
    
  3. 在客户端注入

    public class Client {private final Service service;@Injectpublic Client(@Email Service service) {this.service = service;}
    }
    

4. 常见问题解决

错误:No qualifying bean of type 'Service'
  • 原因:未明确指定使用哪个实现。
  • 修复:添加 @Named 或自定义 @Qualifier 注解。
依赖未生效
  • 检查:确保依赖注入框架(如 Dagger、Guice、Spring)已正确配置,并生成必要的代码(如 Dagger 需运行 kaptannotationProcessor)。
迁移到 Jakarta EE
  • 操作:将 javax.inject 替换为 jakarta.inject,并更新所有导入语句。

5. 总结

  • @Inject:标记注入点。
  • @Named:通过字符串名称区分实现。
  • @Qualifier:定义更类型安全的限定符。
  • 框架适配:根据使用的 DI 工具(Dagger、Spring、Guice)调整配置。

通过合理使用这些注解,可以优雅地管理复杂的依赖关系。




在依赖注入(DI)框架中,如 Spring 或 Google Guice,@Inject@Qualifier@Named 是用于控制依赖注入行为的注解。

  1. @Inject

    • @Inject 注解用于标记一个字段、方法或构造函数,表明应该通过依赖注入框架来注入其依赖项。
    • 在 Spring 中,@Inject 是 JSR-330 标准的一部分,它是 @Autowired 的一个替代方案,但两者在功能上是等效的。
    • 使用 @Inject 可以让代码更加标准化,因为它不依赖于 Spring 特定的注解。
  2. @Qualifier

    • @Qualifier 注解用于在存在多个相同类型的 bean 时,帮助 DI 框架区分应该注入哪个具体的 bean。
    • 它通常与自定义注解一起使用,这些自定义注解被标记为 @Qualifier 的元注解。
    • 在 Spring 中,如果你有两个相同类型的 bean,并且你想通过名称或其他标准来区分它们,你可以使用 @Qualifier 注解。
  3. @Named

    • @Named 注解是 JSR-330 标准的一部分,它提供了一种简单的方法来指定应该注入哪个 bean,当存在多个相同类型的 bean 时。
    • 在 Spring 中,@Named 可以作为 @Qualifier 的一个替代方案,用于通过名称来区分 bean。
    • @Qualifier 不同,@Named 本身就是一个注解,而不需要与自定义注解一起使用。

示例

假设你有一个接口 MyService 和两个实现 MyServiceImpl1MyServiceImpl2

public interface MyService {void doSomething();
}@Service("service1")
public class MyServiceImpl1 implements MyService {@Overridepublic void doSomething() {System.out.println("Doing something in MyServiceImpl1");}
}@Service("service2")
public class MyServiceImpl2 implements MyService {@Overridepublic void doSomething() {System.out.println("Doing something in MyServiceImpl2");}
}

在另一个类中,如果你想注入 MyServiceImpl1,你可以这样做:

public class MyClient {// 使用 @Inject 和 @Named 来指定要注入的 bean@Inject@Named("service1")private MyService myService;public void performAction() {myService.doSomething();}
}

或者,如果你更喜欢使用 @Qualifier,你可以定义一个自定义注解,并使用它来指定要注入的 bean:

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
public @interface Service1Qualifier {
}// 在 MyServiceImpl1 上添加 @Service1Qualifier(这通常不是必需的,除非你有特定的逻辑需要这样做)
// 但在注入点使用它:public class MyClient {// 使用 @Inject 和 @Service1Qualifier 来指定要注入的 bean@Inject@Service1Qualifierprivate MyService myService;public void performAction() {myService.doSomething();}
}// 你还需要在配置中指定哪个 bean 应该与 @Service1Qualifier 关联,这通常是通过 Java 配置或 XML 配置来完成的。

请注意,在上面的 @Service1Qualifier 示例中,我通常不会在 MyServiceImpl1 上使用 @Service1Qualifier 注解,而是直接在注入点使用它,并通过配置来指定哪个 bean 应该被注入。然而,如果你有一个特定的用例需要在实现类上使用它,那也是可以的。

在 Spring Boot 中,你通常不需要显式地定义 @Qualifier 的自定义实现,因为 @Named 已经提供了足够的功能来通过名称区分 bean。但是,如果你想要更复杂的逻辑或更清晰的代码结构,定义自定义的 @Qualifier 注解可能是有意义的。




在使用依赖注入(Dependency Injection, DI)时,@Inject@Qualifier@Named 注解用于指定和限定依赖项。它们是 Java 依赖注入规范(JSR-330)和相关框架的一部分。下面是对这些注解的简要介绍以及如何在项目中引入相应的依赖。

@Inject

@Inject 是 JSR-330 标准的一部分,用来标记一个构造器、方法或字段应该通过依赖注入来提供依赖。

@Qualifier

@Qualifier 是一个元注解(即它被用来创建其他注解),用于限定依赖类型,当有多个相同类型的依赖需要注入时,可以使用自定义的限定符注解来区分不同的实现。

@Named

@Named@Qualifier 的一个具体实现,允许你通过名称来限定依赖。它是 Jakarta 或 javax 注入包中的一个标准注解。

Maven/Gradle 引入依赖

对于 Gradle Kotlin DSL (build.gradle.kts) 或 Groovy 版本 (build.gradle) 的构建脚本,根据你需要的版本选择合适的依赖:

  • Jakarta EE (2.0.1 或更新版本)
// build.gradle.kts
dependencies {implementation("jakarta.inject:jakarta.inject-api:2.0.1") // 确保选择适合你的最新版本
}

或者 Groovy 版本:

// build.gradle
dependencies {implementation 'jakarta.inject:jakarta.inject-api:2.0.1' // 确保选择适合你的最新版本
}
  • javax (适用于旧版本)

如果你必须使用旧版本的 javax 注解,可以这样添加依赖:

// build.gradle.kts
dependencies {implementation("javax.inject:javax.inject:1")
}

或者 Groovy 版本:

// build.gradle
dependencies {implementation 'javax.inject:javax.inject:1'
}

注意:由于包名从 javax.* 更改为 jakarta.*,如果你是在2025年进行开发,并且没有特别的需求去支持旧版本,推荐使用 jakarta.inject 相关的依赖。

此外,若你在使用特定框架如 Spring,它也提供了自己的 @Qualifier@Named 实现,可以直接使用而不需要额外添加上述依赖。确保查阅所使用框架的官方文档以获取更详细的指导。

相关文章:

@Inject @Qualifier @Named

Inject Qualifier Named 在依赖注入&#xff08;DI&#xff09;中&#xff0c;Inject、Qualifier 和 Named 是用于管理对象创建和绑定的关键注解。以下是它们的用途、依赖配置和代码示例的详细说明&#xff1a; 1. 注解的作用 Inject&#xff1a;标记需要注入的构造函数、字段…...

OpenHarmonyOS 3.2 编译生成的hap和app文件的名称如何配置追加版本号?

找了一圈发现官方的文档都是最新的&#xff0c;3.2很多API都不支持&#xff0c;比如获取OhosAppContext&#xff0c;通过OhosAppContext来获取应用版本号&#xff0c;最终是通过读取app.json5的文件内容来读取版本号&#xff0c;最终修改entry下的hvigorfile.ts如下&#xff0c…...

初始化mysql报错cannot open shared object file: No such file or directory

报错展示 我在初始化msyql的时候报错&#xff1a;mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory 解读&#xff1a; libaio包的作用是为了支持同步I/O。对于数据库之类的系统特别重要&#xff0c;因此…...

Vue.js组件开发-实现全屏背景图片滑动切换特效

使用 Vue 实现全屏背景图片滑动切换特效的详细步骤、代码、注释和使用说明。 步骤 创建 Vue 项目&#xff1a;使用 Vue CLI 创建一个新的 Vue 项目。准备图片资源&#xff1a;准备好要用于背景切换的图片&#xff0c;并将它们放在项目的合适目录下。编写 HTML 结构&#xff1…...

AI在自动化测试中的伦理挑战

在软件测试领域&#xff0c;人工智能&#xff08;AI&#xff09;已经不再是遥不可及的未来技术&#xff0c;而是正在深刻影响着测试过程的现实力量。尤其是在自动化测试领域&#xff0c;AI通过加速测试脚本生成、自动化缺陷检测、测试数据生成等功能&#xff0c;极大提升了测试…...

FreeRTOS的任务创建和删除

1&#xff0c;任务创建和删除的API函数 任务的创建和删除本质就是调用FreeRTOS的API函数 动态创建任务&#xff1a; 任务的任务控制块以及任务的栈空间所需的内存&#xff0c;均由 FreeRTOS 从 FreeRTOS 管理的堆中分配。 静态创建任务&#xff1a; 任务的任务控制块以及任务的…...

【C++】STL容器使用与实现详解:vector

文章目录 Ⅰ. vector的介绍和使用一、vector的介绍二、vector的使用 &#xff08;只列出比较重要的&#xff0c;其他的需要时查文档&#xff09;1. vector的定义2. vector iterator&#xff08;迭代器&#xff09;的使用3. vector 容量问题4. vector 增删查改5. 正确释放 vecto…...

【Block总结】动态蛇形卷积,专注于细长和弯曲的局部结构|即插即用

论文信息 标题: Dynamic Snake Convolution based on Topological Geometric Constraints for Tubular Structure Segmentation 作者: 戚耀磊、何宇霆、戚晓明、张媛、杨冠羽 会议: 2023 IEEE/CVF International Conference on Computer Vision (ICCV) 发表时间: 2023年10月…...

物业管理软件引领社区智能化转型提升服务效率与居民生活质量

内容概要 物业管理软件的出现&#xff0c;标志着社区管理方式的一场革命&#xff0c;它不仅仅是一个工具&#xff0c;更是推动智能化转型的关键助力。通过高效的管理功能&#xff0c;物业管理软件在优化服务流程的同时&#xff0c;也提升了居民的生活质量和社区的整体发展活力…...

论文阅读(十三):复杂表型关联的贝叶斯、基于系统的多层次分析:从解释到决策

1.论文链接&#xff1a;Bayesian, Systems-based, Multilevel Analysis of Associations for Complex Phenotypes: from Interpretation to Decision 摘要&#xff1a; 遗传关联研究&#xff08;GAS&#xff09;报告的结果相对稀缺&#xff0c;促使许多研究方向。尽管关联概念…...

线性调整器——耗能型调整器

线性调整器又称线性电压调节器&#xff0c;以下是关于它的介绍&#xff1a; 基本工作原理 线性调整器的基本电路如图1.1(a)所示,晶体管Q1(工作于线性状态,或非开关状态)构成一个连接直流源V和输出端V。的可调电气电阻,直流源V由60Hz隔离变压器&#xff08;电气隔离和整流&#…...

梯度提升用于高效的分类与回归

使用 决策树&#xff08;Decision Tree&#xff09; 实现 梯度提升&#xff08;Gradient Boosting&#xff09; 主要是模拟 GBDT&#xff08;Gradient Boosting Decision Trees&#xff09; 的原理&#xff0c;即&#xff1a; 第一棵树拟合原始数据计算残差&#xff08;负梯度…...

使用Ollama和Open WebUI快速玩转大模型:简单快捷的尝试各种llm大模型,比如DeepSeek r1

Ollama本身就是非常优秀的大模型管理和推理组件&#xff0c;再使用Open WebUI更加如虎添翼&#xff01; Ollama快速使用指南 安装Ollama Windows下安装 下载Windows版Ollama软件&#xff1a;Release v0.5.7 ollama/ollama GitHub 下载ollama-windows-amd64.zip这个文件即可…...

2025年1月个人工作生活总结

本文为 2025年1月工作生活总结。 研发编码 使用sqlite3命令行查询表数据 可以直接使用sqlite3查询数据表&#xff0c;不需进入命令行模式。示例如下&#xff1a; sqlite3 database_name.db "SELECT * FROM table_name;"linux shell使用read超时一例 先前有个编译…...

Windows环境安装nvm,并使用nvm管理nodejs版本教程

目录 1.nvm安装步骤 2.验证nvm是否安装成功 3.查看本地可以安装的所有版本 4.安装特定nodejs版本 5.配置nvm镜像 6.使用特定nodejs版本 7.给nodejs配置镜像和环境变量 8.查看本地安装的所有版本(* 表示当前版本) 9.卸载指定版本的nodejs 前端开发中&#xff0c;不…...

C++中常用的排序方法之——冒泡排序

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C中常用的排序方法之——冒泡排序的…...

SQL进阶实战技巧:如何分析浏览到下单各步骤转化率及流失用户数?

目录 0 问题描述 1 数据准备 2 问题分析 3 问题拓展 3.1 跳出率计算 3.2 计算从浏览商品到支付订单的不同路径的用户数&#xff0c;并按照用户数降序排列。 往期精彩 0 问题描述 统计从浏览商品到最终下单的各个步骤的用户数和流失用户数,并计算转化率 用户表结构和…...

NLP模型大对比:Transformer >Seq2Seq > LSTM > RNN > n-gram

结论 Transformer 大于 传统的Seq2Seq 大于 LSTM 大于 RNN 大于 传统的n-gram n-gram VS Transformer 我们可以用一个 图书馆查询 的类比来解释它们的差异&#xff1a; 一、核心差异对比 维度n-gram 模型Transformer工作方式固定窗口的"近视观察员"全局关联的&q…...

接口技术-第5次作业

目录 作业内容 解答 一、填空题 二、综合题 1.采用AD570通过82C55A与CPU接口&#xff0c;82C55A的端口地址为300H~303H,完成用查询方式采集250个数据&#xff0c;送到2000H开始的存储单元存储。绘制电路连接图&#xff08;AD570的4种主要信号线都要标出&#xff09;。 2…...

实战技巧:如何快速提高网站的收录比例?

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/28.html 快速提高网站的收录比例是网站优化中的重要目标之一。以下是一些实战技巧&#xff0c;可以帮助你实现这一目标&#xff1a; 一、内容优化 高质量原创内容&#xff1a; 确保网站内…...

WEB集群6-10天

第六天 nginx编译安装 全新的进行编译安装 [rootweb-1 ~]# mkdir /nginx [rootweb-1 ~]# cd /nginx/ [rootweb-1 nginx]# ls [rootweb-1 nginx]#curl -O https://nginx.org/download/nginx-1.26.1.tar.gz解压源码包 [rootweb-1 nginx]#tar xf nginx-1.26.1.tar.gz [rootw…...

10.共享内存 信号量集 消息队列

10.共享内存 信号量集 消息队列 **1. IPC对象操作通用框架****2. 共享内存&#xff08;Shared Memory&#xff09;****3. 信号量集&#xff08;Semaphore&#xff09;****4. 消息队列&#xff08;Message Queue&#xff09;****5. 练习与作业****6. 总结** 1. IPC对象操作通用框…...

玩转大语言模型——使用langchain和Ollama本地部署大语言模型

系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用GraphRAGOllama构建知识图谱 玩转大语言模型——完美解决Gra…...

数据结构与算法学习笔记----容斥原理

数据结构与算法学习笔记----容斥原理 author: 明月清了个风 first publish time: 2025.1.30 ps⭐️介绍了容斥原理的相关内容以及一道对应的应用例题。 Acwing 890. 能被整除的数 [原题链接](890. 能被整除的数 - AcWing题库) 给定一个整数 n n n和 m m m个不同的质数 p 1 …...

Appium介绍

在使用不同版本的Appium包进行自动化测试时&#xff0c;出现警告问题可能是由于版本不兼容、配置不正确等原因导致的。下面将详细介绍解决这些问题的步骤&#xff0c;确保模拟器能够正常启动&#xff0c;并能在Appium查看器中同步显示。 1. 环境准备 首先&#xff0c;确保你已…...

doris:Bitmap

BITMAP 类型可以在 Duplicate 表、Unique 表、Aggregate 表中使用&#xff0c;只能作为 Key 类&#xff0c;无法作为 Value 列使用。在 Aggregate 表中使用 BITMAP 类型&#xff0c;其建表时必须使用聚合类型 BITMAP_UNION。用户不需要指定长度和默认值。长度根据数据的聚合程度…...

gitee——报错修改本地密码

有时候当我们向远端push本地的仓库时会有一些报错的行为。 如下&#xff1a; 这是因为我们在gitee修改了密码时&#xff0c;本地还没有更新提交&#xff0c;总是报错 解决修改密码报错 如下&#xff1a; 1.在本地点击搜索栏找到控制面板 步骤如下...

Leetcode 45. 跳跃游戏 II

这题是一个动态规划问题&#xff0c;首先我先说一下自己的动态规划解题步骤&#xff1a; 1&#xff0c;首先需要明确动态规划数组的含义&#xff1a;这个是根据题目来定的&#xff0c;这一个题目的数组含义&#xff1a;dp【i】指的是从0跳到i所需要的最小的步骤。 2&#xff…...

ROS2---基础操作

工作空间(workspace) workspace是一个存放项目开发相关文件的文件夹。例如我们要开发一个机器人&#xff0c;我们可以创建一个工作空间&#xff0c;然后存放这个机器人不同功能的包&#xff08;感知&#xff08;雷达&#xff0c;相机等&#xff09;&#xff0c;运动&#xff0…...

【Leetcode 每日一题】350. 两个数组的交集 II

问题背景 给你两个整数数组 n u m s 1 nums_1 nums1​ 和 n u m s 2 nums_2 nums2​&#xff0c;请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数&#xff0c;应与元素在两个数组中都出现的次数一致&#xff08;如果出现次数不一致&#xff0c;则考虑取较小值…...

第13章 深入volatile关键字(Java高并发编程详解:多线程与系统设计)

1.并发编程的三个重要特性 并发编程有三个至关重要的特性&#xff0c;分别是原子性、有序性和可见性 1.1 原子性 所谓原子性是指在一次的操作或者多次操作中&#xff0c;要么所有的操作全部都得到了执行并 且不会受到任何因素的干扰而中断&#xff0c;要么所有的操作都不执行…...

STM32 PWMI模式测频率占空比

接线图&#xff1a; PWMI基本结构 代码配置&#xff1a; 与上一章输入捕获代码一样&#xff0c;根据结构体&#xff0c;需要在输入捕获单元再配置一个通道。我们调用一个函数 这个函数可以给结构体赋值&#xff0c;当我们定义了一遍结构体参数&#xff0c;再调用这个函数&…...

无心剑七绝《恭贺新春》

七绝恭贺新春 软件通灵万象真 生机繁茂绘星辰 智联世界情不尽 系统更新又一春 2025年1月29日 平水韵十一真平韵 无心剑七绝《恭贺新春》以“软件生态”为题旨&#xff0c;巧妙融入新春喜庆氛围&#xff0c;展现出科技与自然和谐共生的意境。首句“软件通灵万象真”&#xff0c;…...

低代码产品表单渲染架构

在React和Vue没有流行起来的时候&#xff0c;低代码产品的表单渲染设计通常会使用操作Dom的方式实现。 下面是一个表单的例子&#xff1a; 产品层 用户通过打开表单&#xff0c;使用不同业务场景业务下的表单页面&#xff0c;中间的Render层就是技术实现。 每一个不同业务的表单…...

allegro修改封闭图形线宽

说在前面 我们先把最优解说在前面,然后后面再说如果当时不熟悉软件的时候为了挖孔是用了shapes该怎么修改回来。 挖空最方便的方式是在cutout层画一个圆弧,下面开始图解,先add一个圆弧 z 最好是在画的时候就选择好层,如果忘记了后续再换回去也行,但好像软件有bug,此处并…...

C++实现2025刘谦魔术(勺子 筷子 杯子)

目录 1、魔术步骤 2、C代码 2.1、定义物品 2.2、枚举初始顺序 2.3、进行step2筷子交换 2.4、进行step3杯子交换 2.5、进行step4勺子交换 3、运行结果 4、全部源码 又是一年春晚啦&#xff0c;今年比较期待的是刘谦的魔术表演&#xff0c;现在用C实现刘谦的第一个魔术&…...

Leetcode:219

1&#xff0c;题目 2&#xff0c;思路 第一种就是简单的暴力比对当时过年没细想 第二种&#xff1a; 用Map的特性key唯一&#xff0c;把数组的值作为Map的key值我们每加载一个元素都会去判断这个元素在Map里面存在与否如果存在进行第二个判断条件abs(i-j)<k,条件 符合直接…...

SpringBoot+Vue的理解(含axios/ajax)-前后端交互前端篇

文章目录 引言SpringBootThymeleafVueSpringBootSpringBootVue&#xff08;前端&#xff09;axios/ajaxVue作用响应式动态绑定单页面应用SPA前端路由 前端路由URL和后端API URL的区别前端路由的数据从哪里来的 Vue和只用三件套axios区别 关于地址栏url和axios请求不一致VueJSPS…...

小米CR6606,CR6608,CR6609 启用SSH和刷入OpenWRT 23.05.5

闲鱼上收了一台CR6606和一台CR6609, 一直没时间研究, 趁春节假期把这两个都刷成 OpenWRT 配置说明 CPU: MT7621AT&#xff0c;双核880MHz内存: NT5CC128M16JR-EKI 或 M15T2G16128A, 256MB闪存: F59L1G81MB, 128MB无线基带芯片(BB): T7905DAN无线射频芯片(RF): MT7975DN无外置F…...

我的求职面经:(2)C++中空指针请使用nullptr不要使用NULL

1. C中NULL定义就是整数字面量0 2. 对于C函数&#xff0c;由于存在重载&#xff0c;使用NULL而不是nullptr可能导致函数走错重载。 3. C中定义NULL为&#xff08;void* &#xff09;0&#xff0c;确实是代表空指针。使用时隐式转换成对应的需要类型的空指针。 4. C中void指针…...

Java8_StreamAPI

Stream 1.创建流 1.1 集合创建流 List<String> list List.of("a", "b", "c"); Stream<String> stream list.stream(); stream.forEach(System.out::println);1.2 数组创建流 String[] array {"a","b",&qu…...

[STM32 - 野火] - - - 固件库学习笔记 - - -十二.基本定时器

一、定时器简介 STM32 中的定时器&#xff08;TIM&#xff0c;Timer&#xff09;是其最重要的外设之一&#xff0c;广泛用于时间管理、事件计数和控制等应用。 1.1 基本功能 定时功能&#xff1a;TIM定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中…...

信息学奥赛一本通 1606:【 例 1】任务安排 1 | 洛谷 P2365 任务安排

【题目链接】 ybt 1606&#xff1a;【 例 1】任务安排 1 洛谷 P2365 任务安排 【题目考点】 1. 动态规划&#xff1a;线性动规 【解题思路】 可以先了解法1&#xff0c;虽然不是正解&#xff0c;但该解法只使用了动规的基本思路&#xff0c;易于理解&#xff0c;有助于理解…...

【解决方案】MuMu模拟器移植系统进度条卡住98%无法打开

之前在Vmware虚拟机里配置了mumu模拟器&#xff0c;现在想要移植到宿主机中 1、虚拟机中的MuMu模拟器12-1是目标系统&#xff0c;对应的目录如下 C:\Program Files\Netease\MuMu Player 12\vms\MuMuPlayer-12.0-1 2、Vmware-虚拟机-设置-选项&#xff0c;启用共享文件夹 3、复…...

【C语言】预处理详解

他们想要逃避工作的压迫&#xff0c;却又被功绩社会深植的价值观绑架。 前言 这是我自己学习C语言的第九篇博客总结。后期我会继续把C语言学习笔记开源至博客上。 上一期笔记是关于C语言的编译链接&#xff0c;没看的同学可以过去看看&#xff1a; 【C语言】编译链接_c 读取一行…...

设计模式Python版 适配器模式

文章目录 前言一、适配器模式二、适配器模式实现三、适配器模式在Django中的应用 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&…...

系统思考—蝴蝶效应

“个体行为的微小差异&#xff0c;可能在系统中引发巨大且不可预测的结果。” — 诺贝尔经济学得主托马斯谢林 我们常说&#xff0c;小变动带来大影响&#xff0c;这种现象&#xff0c;在复杂系统理论中被称为“蝴蝶效应”&#xff1a;即使极小的变化&#xff0c;也能在动态系…...

使用Edu邮箱申请一年免费的.me域名

所需材料&#xff1a;公立Edu教育邮箱一枚&#xff08;P.S&#xff1a;该服务不支持所有的Edu教育邮箱&#xff0c;仅支持比较知名的院校&#xff09; 说到域名&#xff0c;.me这个后缀可谓是个性十足&#xff0c;适合个人网站、博客等。.me是黑山的国家顶级域名&#xff08;c…...

【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)

本文项目编号 T 165 &#xff0c;文末自助获取源码 \color{red}{T165&#xff0c;文末自助获取源码} T165&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

C++ ——— 仿函数

目录 何为仿函数 仿函数和模板的配合使用 何为仿函数 代码演示&#xff1a; class Add { public:int operator()(int x, int y){return x y;} }; 这是一个 Add 类&#xff0c;类里面有一个公有成员函数重载&#xff0c;重载的是括号 那么调用的时候&#xff1a; Add ad…...