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

【Spring】DI(依赖注入)详解:属性注入@Autowired(超详细)、构造方法注入、Setter注入

1.DI(依赖注入)介绍

1.1DI是什么?

DI(Dependency Injection,依赖注入) 是 Spring 框架中实现 IoC(控制反转)的一种核心机制。如果说 IoC 是一种设计思想,告诉我们“把控制权交给容器”,那么 DI 就是具体的“施工队”,负责把依赖关系“注入”到对象中。简单来说,DI 让对象不再自己创建或查找依赖,而是由 Spring 容器主动提供

想象你在咖啡店点一杯拿铁,传统方式是你自己买咖啡豆、牛奶,回家磨粉、蒸奶、拉花;而有了 DI,就像你告诉服务员“我要一杯拿铁”,她直接把成品端给你。你不用关心原料从哪来,咖啡机怎么操作,只管享受结果。DI 在 Spring 中也是如此:容器负责准备好依赖(比如数据库连接、服务类),然后通过某种方式“送”到你的对象里。

一句话概括:DI 是 Spring 实现 IoC 的手段,通过将依赖注入到对象中,降低耦合,提升灵活性。

1.2DI和IoC的关系

DI 是 IoC 的具体实现方式之一。IoC 是一种思想,强调“控制反转”,即对象的创建和依赖管理由外部(容器)接管。而 DI 是实现这种反转的常见手段,通过“注入”方式让对象获取依赖,而不是自己去“拿”。

在 Spring 中,DI 负责:
创建对象:容器实例化 Bean。
管理依赖:根据配置(注解、XML 或 Java 配置),将所需的 Bean 注入到目标对象。
降低耦合:对象无需关心依赖的创建细节,只需声明需要什么。

生活比喻:IoC 像你决定把家务外包给管家,DI 是管家具体干活的方式,比如他帮你把洗好的衣服(依赖)放进衣柜(对象)。

1.3 什么是依赖?

在软件开发中,依赖(Dependency) 指的是一个对象(或模块)为了完成其功能,需要依赖的另一个对象(或模块)。简单来说,如果对象 A 的工作需要对象 B 的支持,那么 B 就是 A 的依赖。依赖描述了一种“需要”的关系,体现了对象之间的协作。

在 Spring 的上下文中,依赖通常是 IoC 容器管理的 Bean(对象),通过依赖注入(DI)机制,容器将这些依赖提供给需要它们的其他 Bean。这种机制让对象之间的关系更松散、更灵活。

生活化比喻:想象你在做披萨,面团、奶酪和番茄酱是你的“依赖”。没有这些材料,你没法完成披萨。传统做法是你自己去买材料(硬编码依赖),而 Spring 的 DI 就像一个助手,自动把材料送到你面前(注入依赖),你只管专注烤披萨。

示例:
UserController类中有成员变量UserService,可以说UserServiceBean是UserControllerBean的依赖

UserService类:

@Service
public class UserService {public void doUserService() {System.out.println("doUserService...");}
}

UserController类:

@Controller
public class UserController {// UserController依赖UserServiceprivate UserService userService;public void doUserController(){System.out.println("douserController...");}
}

2.依赖注入

2.1属性注入@Autowired

在创建成员变量的上面写@Autowried注解就是注入依赖:

UserService类:

@Service
public class UserService {public void doUserService() {System.out.println("doUserService...");}
}

UserController类:

@Controller
public class UserController {// 注入UserService依赖@Autowriedprivate UserService userService;public void doUserController(){//执行UserService的方法userService.doUserService();System.out.println("douserController...");}
}

获取UserController的Bean,然后执行Bean的方法:

@SpringBootApplication
public class Test1Application {public static void main(String[] args) {// 获取上下文ApplicationContext context = SpringApplication.run(Test1Application.class, args);//获取userControllerUserController userController = (UserController)context.getBean("userController");userController.doUserController();}
}

运行后,结果:
在这里插入图片描述

说明:UserController 不再自己创建 UserService,而是由 Spring 容器注入。这种方式让 UserController只关心如何使用 UserService,而不关心它从哪来。

如果不使用@Autowried会怎么样呢?
UserController类:

@Controller
public class UserController {// 注入UserService依赖@Autowriedprivate UserService userService;public void doUserController(){//执行UserService的方法userService.doUserService();System.out.println("douserController...");}
}

其他的代码不变,运行,结果:
在这里插入图片描述
NullPointer:空指针

通过调试发现,userService对象是空的
在这里插入图片描述

原因:程序运行的时候没有向UserController注入UserControllerBean。

2.2构造方法注入

2.2.1 一个参数和一个有参构造函数

UserService类:

@Service
public class UserService {public void doUserService() {System.out.println("doUserService...");}
}

UserController类:

@Controller
public class UserController {private UserService userService;//构造函数注入依赖public UserController(UserService userService) {this.userService = userService;}public void doUserController(){userService.doUserService();System.out.println("douserController...");}
}

获取UserController的Bean,然后执行Bean的方法:

@SpringBootApplication
public class Test1Application {public static void main(String[] args) {// 获取上下文ApplicationContext context = SpringApplication.run(Test1Application.class, args);//获取userControllerUserController userController = (UserController)context.getBean("userController");userController.doUserController();}
}

运行后,结果:
在这里插入图片描述

2.2.2 多个有参构造方法和无参构造方法

基于上面的类,再添加一个UserInfo类:

@Data
public class UserInfo {private int id;private String name;private int age;}
@Configuration
public class BeanConfig {@Beanpublic String name1(){return "liming";}@Bean(name={"u1","userInfo1"})public UserInfo userInfo1( @Qualifier("name1") String name){UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setName(name);userInfo.setAge(18);return userInfo;}
}

UserController类改为:

@Controller
public class UserController {private UserService userService;private UserInfo userInfo;public UserController(){}public UserController(UserService userService) {this.userService = userService;}public UserController(UserService userService, UserInfo userInfo) {this.userService = userService;this.userInfo = userInfo;}public void doUserController(){userService.doUserService();System.out.println("douserController...");}
}

其他的代码不变,运行,结果:
在这里插入图片描述
NullPointer:空指针

这是为什么呢?
答:当有多个构造函数和无参构造函数时,默认会调用无参构造函数,导致没有依赖注入。

把无参的构造函数删除,再次运行:

UserController类改为:

@Controller
public class UserController {private UserService userService;private UserInfo userInfo;public UserController(UserService userService) {this.userService = userService;}public UserController(UserService userService, UserInfo userInfo) {this.userService = userService;this.userInfo = userInfo;}public void doUserController(){userService.doUserService();System.out.println("douserController...");}
}

运行后还会报错

为什么呢?
当有多个构造函数时会调用无参构造函数,如果没有无参构造函数则会报错。

解决方法
使用注解指定使用哪个构造函数:

@Controller
public class UserController {private UserService userService;private UserInfo userInfo;@Autowiredpublic UserController(UserService userService) {this.userService = userService;}public UserController(UserService userService, UserInfo userInfo) {this.userService = userService;this.userInfo = userInfo;}public void doUserController(){userService.doUserService();System.out.println("douserController...");}
}

运行结果:
在这里插入图片描述

2.3 Setter注入

Setter方法注入需要使用注解@Autowired:

UserService类:

@Service
public class UserService {public void doUserService() {System.out.println("doUserService...");}
}

UserController类:

@Controller
public class UserController {private UserService userService;//Setter方法注入@Autowiredpublic void setUserService(UserService userService){this.userService = userService;}public void doUserController(){userService.doUserService();System.out.println("douserController...");}
}

运行结果:
在这里插入图片描述

2.4三种注入优缺点分析

  1. 属性注⼊

    • 优点: 简洁,使⽤⽅便;
    • 缺点:
      (1)只能⽤于 IoC 容器,如果是非 IoC 容器不可⽤,并且只有在使⽤的时候才会出现 NPE(空指针异常)
      (2)不能注⼊⼀个Final修饰的属性
  2. 构造函数注⼊(Spring 4.X推荐)

    • 优点:
      (1)可以注⼊final修饰的属性
      (2)注⼊的对象不会被修改
      (3)依赖对象在使⽤前⼀定会被完全初始化,因为依赖是在类的构造⽅法中执⾏的,⽽构造⽅法是在类加载阶段就会执⾏的⽅法.
      (4)通⽤性好, 构造⽅法是JDK⽀持的, 所以更换任何框架,他都是适⽤的
    • 缺点:
      注⼊多个对象时, 代码会⽐较繁琐
  3. Setter注⼊(Spring 3.X推荐)

    • 优点: ⽅便在类实例之后, 重新对该对象进⾏配置或者注⼊
    • 缺点:
      (1)不能注⼊⼀个Final修饰的属性
      (2)注⼊对象可能会被改变, 因为setter⽅法可能会被多次调⽤, 就有被修改的⻛险.

3.@Autowired存在问题

3.1同一类型存在多个bean

当同⼀类型存在多个bean时, 使⽤@Autowired会存在问题:

BeanConfig类中有Bean方法:

@Configuration
public class BeanConfig {@Beanpublic String name1(){return "liming";}@Bean(name={"u1","userInfo1"})public UserInfo userInfo1( @Qualifier("name1") String name){UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setName(name);userInfo.setAge(18);return userInfo;}@Beanpublic UserInfo userInfo2(){UserInfo userInfo =new UserInfo();userInfo.setId(2);userInfo.setName("张三");userInfo.setAge(20);return userInfo;}
}

UserService类:

@Service
public class UserService {public void doUserService() {System.out.println("doUserService...");}
}

UserController类:

@Controller
public class UserController {@Autowiredprivate UserService userService;@Autowiredprivate UserInfo userInfo;public void doUserController(){userService.doUserService();System.out.println("douserController...");System.out.println(userInfo);}
}

取出Bean,并执行方法:

@SpringBootApplication
public class Test1Application {public static void main(String[] args) {// 获取上下文ApplicationContext context = SpringApplication.run(Test1Application.class, args);//获取userControllerUserController userController = (UserController)context.getBean("userController");userController.doUserController();}
}

运行结果:
在这里插入图片描述

怎么解决呢?

3.2 解法1:属性名和需要使用的对象名保持一致

UserController类:

@Controller
public class UserController {@Autowiredprivate UserService userService;@Autowiredprivate UserInfo userInfo1; //Bean的名字是userInfopublic void doUserController(){userService.doUserService();System.out.println("douserController...");System.out.println(userInfo1);}
}

运行结果:
在这里插入图片描述

3.3 解法2:@Primary

使用@Primary注解,指定该Bean是默认的

@Configuration
public class BeanConfig {@Beanpublic String name1(){return "liming";}@Primary  //指定该Bean是默认的@Bean(name={"u1","userInfo1"})public UserInfo userInfo1( @Qualifier("name1") String name){UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setName(name);userInfo.setAge(18);return userInfo;}@Beanpublic UserInfo userInfo2(){UserInfo userInfo =new UserInfo();userInfo.setId(2);userInfo.setName("张三");userInfo.setAge(20);return userInfo;}
}

运行结果:
在这里插入图片描述

3.4解法3:@Qualifier

使⽤@Qualifier注解:

UserController类:

@Controller
public class UserController {@Autowiredprivate UserService userService;@Qualifier("userInfo1") //指定名字为userInfo1的Bean注入private UserInfo userInfo1; //Bean的名字是userInfopublic void doUserController(){userService.doUserService();System.out.println("douserController...");System.out.println(userInfo1);}
}

运行结果:
在这里插入图片描述
userInfo的内容为什么是null呢?

@Qualifier注解不能单独使⽤,必须配合@Autowired使⽤

修改后的UserController类:

@Controller
public class UserController {@Autowiredprivate UserService userService;@Autowired@Qualifier("userInfo1") //指定名字为userInfo1的Bean注入private UserInfo userInfo1; //Bean的名字是userInfopublic void doUserController(){userService.doUserService();System.out.println("douserController...");System.out.println(userInfo1);}
}

运行结果:
在这里插入图片描述
注:
@Qualifier注解不能单独使⽤,必须配合@Autowired使⽤

3.5 解法4:@Resource

使⽤@Resource注解:是按照bean的名称进⾏注⼊。通过name属性指定要注⼊的bean的名称。

@Controller
public class UserController {@Autowiredprivate UserService userService;@Resource(name="userInfo1")private UserInfo userInfo1;public void doUserController(){userService.doUserService();System.out.println("douserController...");System.out.println(userInfo1);}
}

运行结果:
在这里插入图片描述

4.常见面试题

@Autowird 与 @Resource的区别
(1)@Autowired 是spring框架提供的注解,⽽@Resource是JDK提供的注解
(2)@Autowired 默认是按照类型注⼊,⽽@Resource是按照名称注⼊. 相⽐于 @Autowired 来说, @Resource ⽀持更多的参数设置,例如 name 设置,根据名称获取 Bean。

Autowired装配顺序:
在这里插入图片描述

5.总结

5.1Spring, Spring Boot 和Spring MVC的关系以及区别

Spring: 简单来说, Spring 是⼀个开发应⽤框架,什么样的框架呢,有这么⼏个标签:轻量级、⼀站式、模块化,其⽬的是⽤于简化企业级应⽤程序开发.

Spring的主要功能: 管理对象,以及对象之间的依赖关系, ⾯向切⾯编程, 数据库事务管理, 数据访问, web框架⽀持等.
但是Spring具备⾼度可开放性, 并不强制依赖Spring, 开发者可以⾃由选择Spring的部分或者全部, Spring可以⽆缝继承第三⽅框架, ⽐如数据访问框架(Hibernate 、JPA), web框架(如Struts、 JSF)

Spring MVC: Spring MVC是Spring的⼀个⼦框架, Spring诞⽣之后, ⼤家觉得很好⽤, 于是按照MVC模式设计了⼀个 MVC框架(⼀些⽤Spring 解耦的组件), 主要⽤于开发WEB应⽤和⽹络接⼝,所以, Spring MVC 是⼀个Web框架.

Spring MVC基于Spring进⾏开发的, 天⽣的与Spring框架集成. 可以让我们更简洁的进⾏Web层开发, ⽀持灵活的 URL 到⻚⾯控制器的映射, 提供了强⼤的约定⼤于配置的契约式编程⽀持, ⾮常容易与其他视图框架集成,如 Velocity、FreeMarker等

Spring Boot: Spring Boot是对Spring的⼀个封装, 为了简化Spring应⽤的开发⽽出现的,中⼩型企业,没有成本研究⾃⼰的框架, 使⽤Spring Boot 可以更加快速的搭建框架, 降级开发成本, 让开发
⼈员更加专注于Spring应⽤的开发,⽽⽆需过多关注XML的配置和⼀些底层的实现.
Spring Boot 是个脚⼿架, 插拔式搭建项⽬, 可以快速的集成其他框架进来.

⽐如想使⽤SpringBoot开发Web项⽬, 只需要引⼊Spring MVC框架即可, Web开发的⼯作是 SpringMVC完成的, ⽽不是SpringBoot, 想完成数据访问, 只需要引⼊Mybatis框架即可.
Spring Boot只是辅助简化项⽬开发的, 让开发变得更加简单, 甚⾄不需要额外的web服务器, 直接⽣成jar包执⾏即可.

最后⼀句话总结: Spring MVC和Spring Boot都属于Spring,Spring MVC 是基于Spring的⼀个 MVC 框架,⽽Spring Boot 是基于Spring的⼀套快速开发整合包.

这三者专注的领域不同,解决的问题也不⼀样, 总的来说,Spring 就像⼀个⼤家族,有众多衍⽣产品, 但他们的基础都是Spring, ⽤⼀张图来表⽰他们三个的关系:

5.2 Bean 的命名

1)五⼤注解存储的bean
① 前两位字⺟均为⼤写, bean名称为类名
② 其他的为类名⾸字⺟⼩写
③ 通过 value属性设置@Controlller(values="name")

2)@Bean 注解存储的bean
① bean名称为⽅法名
②通过name属性设置@Bean(name={"name1","name"})

5.3常见面试题

1)三种注⼊⽅式的优缺点(参考上⾯内容)

2)常⻅注解有哪些? 分别是什么作⽤? web url映射: @RequestMapping
参数接收和接⼝响应: @RequestParam, @RequestBody, @ResponseBody
bean的存储: @Controller, @Service, @Repository, @Component, @Configuration, @Bean
bean的获取: @Autowired, @Qualifier, @Resource

3)@Autowired 和@Resource 区别

4)说下你对Spring, SpringMVC, Springboot的理解(参考上⾯内容)

相关文章:

【Spring】DI(依赖注入)详解:属性注入@Autowired(超详细)、构造方法注入、Setter注入

1.DI(依赖注入)介绍 1.1DI是什么? DI(Dependency Injection,依赖注入) 是 Spring 框架中实现 IoC(控制反转)的一种核心机制。如果说 IoC 是一种设计思想,告诉我们“把控…...

Spring Boot 中配置 Redis 连接池的详细

目录 一、添加依赖二、配置 Redis 连接池&#xff08;一&#xff09;通过 Java 配置类&#xff08;二&#xff09;通过 application.properties 文件 三、测试 Redis 操作四、总结 一、添加依赖 在 pom.xml 文件中添加以下依赖&#xff1a; <dependencies><dependen…...

系统架构设计师:系统架构概述案例分析与简答题、详细解析与评分要点

10道系统架构概述知识体系案例分析与简答题&#xff0c;涵盖架构设计原则、质量属性、演化过程、评估方法等核心考点&#xff0c;并附详细解析与评分要点&#xff1a; 一、案例分析题&#xff08;5题&#xff09; 1. 电商系统高并发场景下的架构设计 背景&#xff1a;某电商平…...

关于系统架构思考,如何设计实现系统的高可用?

绪论、系统高可用的必要性 系统高可用为了保持业务连续性保障&#xff0c;以及停机成本量化&#xff0c;比如在以前的双十一当天如果出现宕机&#xff0c;那将会损失多少钱&#xff1f;比如最近几年Amazon 2021年30分钟宕机损失$5.6M。当然也有成功的案例&#xff0c;比如异地…...

阿里云短信服务与ASP.NET对接实例

准备工作 注册阿里云账号并开通阿里大于(现称"阿里云短信服务")服务 获取AccessKey ID和AccessKey Secret 申请短信签名和短信模板并审核通过 ASP.NET Web项目集成步骤 1. 安装阿里云SDK 通过NuGet包管理器安装阿里云短信服务SDK&#xff1a; Install-Package…...

【含文档+PPT+源码】基于微信小程序健康管理之健身房管理系统的设计与实现

课程目标&#xff1a; 教你从零开始部署运行项目&#xff0c;学习环境搭建、项目导入及部署&#xff0c;含项目源码、文档、数据库、软件等资料 课程简介&#xff1a; 本课程演示的是一款基于微信小程序健康管理之健身房管理系统的设计与实现&#xff0c;主要针对计算机相关…...

微信小程序转为App实践篇 FinClip

参考下面链接先 开始实践 微信小程序转为App并上架应用市场_微信小程序生成app-CSDN博客 首先在FinClip 官网上下载应用 小程序开发工具下载_小程序sdk下载资源-FinClip资源下载|泰坪小程序开放平台 下载到本地安装 打开导入自己的小程序项目&#xff1b;导入时会解析自己的…...

Qt/C++学习系列之QTreeWidget的简单使用记录

Qt/C学习系列之QTreeWidget的简单使用记录 前言1布局1.1布局要求1.2布局代码 2代码设计2.1整体勾选2.2勾选项确认 总结 前言 自己练手的项目中&#xff0c;需要对多个不同层级的选项进行勾选操作&#xff0c;而想到简洁点的操作方式就是使用QTreeWidget进行布局与应用。这里简…...

标易行项目redis内存中放哪些数据

结合你的项目经验,以下是 标易行投标服务平台 中 Redis 内存存储的核心数据类型及具体应用场景分析: 1. 用户订阅配置与实时推送 场景需求:用户订阅招标商机后,系统需实时推送符合订阅条件(如行业、区域、关键词)的标讯。Redis 存储数据: 订阅规则缓存:以 Hash 存储用户…...

redis 放置序列化的对象,如果修改对象,需要修改版本号吗?

在 Redis 中存储序列化对象时,如果修改了对象的类结构(例如增删字段、修改字段类型或顺序),是否需要修改版本号取决于序列化协议的兼容性策略和业务场景的容错需求。以下是详细分析: 1. 为什么需要考虑版本号? 序列化兼容性问题: 当对象的类结构发生变化时,旧版本的序列…...

MySQL——流程控制

一、IF条件语句 语法 IF condition THENstatements; ELSEIF condition THENstatements; ELSEstatements; END IF; 判断成绩等级 # 判断成绩等级 # 输入学生的编号,取出学生的第一门课&#xff0c;然后判断当前的课程的等级 drop procedure if exists p2; delimiter $$ crea…...

蓝桥杯 1.路径之谜

1.路径之谜 原题目链接 问题描述 小明冒充 X 星球 的骑士&#xff0c;进入了一个奇怪的城堡。城堡里边什么都没有&#xff0c;只有方形石头铺成的地面。假设城堡的地面是 n n 的方格&#xff0c;如下图所示&#xff1a; 骑士要从西北角走到东南角。可以横向或纵向移动&…...

学习笔记十二——Rust 高阶函数彻底入门(超详细过程解析 + 每步数值追踪)

&#x1f4a1; 彻底搞懂 Rust 高阶函数&#xff01;新手最容易卡住的语法 调用流程全讲透&#xff08;含逐步拆解&#xff09; Rust 函数式编程中有一个常见却经常让人懵的概念&#xff1a;高阶函数&#xff08;Higher-Order Function&#xff09; 一看到 fn(i32) -> i32、…...

Spring Cache(笔记)

简介&#xff1a; 常用注解&#xff1a;...

MySQL入门:数据表的创建

​今天我们来介绍一下除HTML外的另一种语言&#xff1a;MySQL语言&#xff1b; MySQL&#xff1a;即一种用于管理和处理关系数据库的标准语言。要用于执行查询、更新、管理数据库中的数据以及定义和操作数据库结构。 接下来我会逐一介绍它的作用以及其中数据表&#xff0c;数据…...

Vue3服务端渲染(SSR)深度调优:架构裂变与性能突围

一、全链路渲染管控系统 1.1 智能DNS路由策略 1.2 区域化渲染成本矩阵 区域计算成本($/h)网络成本($/GB)命中率QoS保障等级北美东部0.240.0892%SLA-99.9亚太东南0.280.1285%SLA-99.5欧洲西部0.310.1588%SLA-99.7南美圣保罗0.350.1878%SLA-99.0 二、多维度缓存治理策略 2.1 量…...

Python基础语法2

目录 1、顺序语句 2、条件语句 2.1、语法格式 2.2、缩进和代码块 3、空语句 4、循环语句 4.1、while循环 4.2、for循环 4.3、continue 4.4、break 5、综合案例 1、顺序语句 默认情况下&#xff0c;Python 的代码执行顺序是按照从上到下的顺序&#xff0c;依次执行的…...

部署LLaMA Factory,及快速使用

什么是LLaMA Factory LLaMA Factory 是一个围绕 Meta 的 LLaMA&#xff08;Large Language Model Meta AI&#xff09;模型设计的工具或代码结构&#xff0c;主要用于简化模型的创建、管理和部署。以下是其关键点解析&#xff1a; 1. ​​核心概念​​ ​​LLaMA 模型​​&a…...

11.第二阶段x64游戏实战-框架代码细节优化

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;10.第二阶段x64游戏实战-添加计时器 首先是这个GameData类&#xff0c;我们要让…...

Spring Boot 中使用 Netty

2025/4/15 向 一、什么是Netty Netty 是 Java 中一个非常高性能的网络通信框架&#xff0c;用来开发服务器和客户端程序&#xff0c;主要用于处理 TCP/UDP 的网络连接&#xff0c;比如&#xff1a; 聊天服务 实时推送 高并发网络通信&#xff08;比如游戏、IoT、金融系统&a…...

【Leetcode-Hot100】最大子数组和

题目 解答 class Solution(object):def maxSubArray(self, nums):""":type nums: List[int]:rtype: int"""len_nums len(nums)result -1e5left_fit, right_fit 0, len_nums-1if len_nums 1:return nums[0]sum_left, sum_right 0, 0while r…...

Android 项目 Camera 问题:Fail to connect to camera service

问题与处理策略 问题描述 在 Android 项目中&#xff0c;使用相机时&#xff0c;报如下错误 java.lang.RuntimeException: Fail to connect to camera service# 翻译无法连接到相机服务问题原因 通常情况是应用没有获取到相机权限&#xff0c;导致连接相机服务失败 Android…...

Java二叉树深度解析:结构、算法与应用实践指南

一、二叉树核心概念体系 1. 二叉树基础定义 graph TBA((根节点)) --> B((左子节点))A --> C((右子节点))B --> D((叶子节点))B --> E((叶子节点))C --> F[null]C --> G((叶子节点)) 2. 二叉树类型对比 类型结构特性典型应用场景普通二叉树任意节点最多两…...

阿里FPGA XCKU3P开箱- 25G 光纤

阿里FPGA XCKU3P开箱 - Hello-FPGA - 博客园 25G 光纤 板子有2个SFP的光纤接口&#xff0c;最大支持25G速率&#xff0c;使用ibert 进行验证&#xff0c;SFP在BANK227的GTY 接口。 ibert 配置如下&#xff1a; 测试 测试符合预期&#xff0c;确认了SFP的具体位置 和 支持的速…...

深度学习之微积分

2.4.1 导数和微分 2.4.2 偏导数 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/17227e00adb14472902baba4da675aed.png 2.4.3 梯度 具体证明&#xff0c;矩阵-向量积...

Android系统通知机制深度解析:Framework至SystemUI全链路剖析

1. 前言 在Android 13的ROM定制化开发中&#xff0c;系统通知机制作为用户交互的核心组件&#xff0c;其实现涉及Framework层到SystemUI的复杂协作。本文将深入剖析从Notification发送到呈现的全链路流程&#xff0c;重点解析关键类的作用机制及系统服务间的交互逻辑&#xff…...

spatk-sql核心

在大数据处理领域&#xff0c;Apache Spark已成为不可或缺的工具&#xff0c;而Spark SQL作为其重要组件&#xff0c;以独特的设计与强大功能&#xff0c;在结构化数据处理中扮演着核心角色。 一、Spark SQL的架构基石 Spark SQL构建于Spark核心之上&#xff0c;充分利用了Sp…...

高级语言调用C接口(二)回调函数(3)C#

原接口定义请参照高级语言调用C接口(二)回调函数(2) 我们直接来看C#的接口定义 [DllImport("XXX.dll")]public static extern IntPtr Init(string pcPayDeviceIP, int usTlsPort, OnPayResult onPayResult); 委托定义 [UnmanagedFunctionPointer(CallingConvention…...

ns-3中UDP饱和流发包时间间隔设置最合理值

ns3的官方手册很全&#xff0c;相关书籍也是有的&#xff0c;官网先贴在这里&#xff1a; ns-3 | a discrete-event network simulator for internet systemsa discrete-event network simulator for internet systemshttps://www.nsnam.org/相关的脚本介绍也都有一些&#xf…...

深度学习(第1章——神经网络原理和Pytorch入门)

前言&#xff1a; 本章将讲解神经网络原理&#xff0c;神经元如何处理输入并输出&#xff0c;什么是梯度&#xff0c;多层感知机中梯度的计算&#xff0c;Pytoch自动梯度效果&#xff0c;如何使用原生Python实现一个简单的神经网络&#xff0c;以及对应Pytorch实现。 神经网络原…...

使用DeepSeek AI高效降低论文重复率

一、论文查重原理与DeepSeek降重机制 1.1 主流查重系统工作原理 文本比对算法:连续字符匹配(通常13-15字符)语义识别技术:检测同义替换和结构调整参考文献识别:区分合理引用与不当抄袭跨语言检测:中英文互译内容识别1.2 DeepSeek降重核心技术 深度语义理解:分析句子核心…...

【3D文件】3D打印迪迦奥特曼,3D打印的迪迦圣像,M78遗迹管理局,5款不同的3D打印迪迦免费下载,总有一款适合你

【3D文件】3D打印迪迦奥特曼&#xff0c;3D打印的迪迦圣像&#xff0c;M78遗迹管理局&#xff0c;5款不同的3D打印迪迦免费下载&#xff0c;总有一款适合你 资源下载&#xff1a; 3D文件AI生成器&#xff0c;机器学习生成&#xff0c;AI生成3D文件&#xff0c;3D打印迪迦奥特…...

【未解决】Spring AI 1.0.0-M6 使用 Tool Calling 报错,请求破解之法

1.报错 2.Java 代码 2.1 pom.xml <dependencyManagement><dependencies><!-- Spring AI --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-M6</ver…...

第 2 篇:快速上手 Framer Motion(实操入门)

1. 环境准备 在开始使用 Framer Motion 之前&#xff0c;你需要先确保你的开发环境中已经设置好了 React 项目。我们将使用 Next.js 作为示例&#xff0c;如果你是使用其他 React 框架&#xff0c;步骤也基本相同。 1.1 创建一个 Next.js 项目 如果你还没有创建 Next.js 项目…...

如何写好合同管理系统需求分析

引言 在当今企业数字化转型的浪潮中&#xff0c;合同管理系统作为企业法律合规和商业运营的重要支撑工具&#xff0c;其需求分析的准确性和完整性直接关系到系统建设的成败。本文基于Volere需求过程方法论&#xff0c;结合江铃汽车集团合同管理系统需求规格说明书实践案例&…...

C语言自定义类型详解一:结构体(内存对齐)

结构体的声明&#xff1a; 结构体是一些值的集合&#xff0c;这些值是成员变量&#xff0c;结构体的每个成员可以是不同类型的变量&#xff08;包括其他结构体变量&#xff09; 类如&#xff1a;描述一个学生 struct Stu {char name[200];int age;char sex[5];//性别char id…...

GitHub配置密钥

1.生成SSH密钥 1&#xff09;检查 SSH 密钥是否存在 首先&#xff0c;确认是否已经在本地系统中生成了 SSH 密钥对。可以通过以下命令检查&#xff1a; ls -al ~/.ssh 在命令输出中&#xff0c;应该能看到类似 id_rsa 和 id_rsa.pub 这样一对文件。如果这些文件不存在&#…...

PyTorch逻辑回归总结

目录 PyTorch逻辑回归总结神经网络基础基本结构学习路径 线性回归简单线性回归多元线性回归 逻辑回归核心原理损失函数 梯度下降法基本思想关键公式学习率影响 PyTorch实现数据准备模型构建代码优化 核心概念对比 PyTorch逻辑回归总结 神经网络基础 基本结构 输入节点隐藏节…...

Browser-use 是连接你的AI代理与浏览器的最简单方式

AI MCP 系列 AgentGPT-01-入门介绍 Browser-use 是连接你的AI代理与浏览器的最简单方式 AI MCP(大模型上下文)-01-入门介绍 AI MCP(大模型上下文)-02-awesome-mcp-servers 精选的 MCP 服务器 AI MCP(大模型上下文)-03-open webui 介绍 是一个可扩展、功能丰富且用户友好的…...

nginx自编译重现gzip和chunked的现象

前言 最近做项目&#xff0c;发现一个比较好玩的事&#xff0c;nginx的module gzip模式默认支持1KB压缩&#xff0c;和chunked返回&#xff0c;本来现在的很多框架都很完善了&#xff0c;但是&#xff0c;一些新语言框架或者一些老旧框架会不能完整支持chunked&#xff0c;导致…...

RNN - 循环神经网络(概念介绍)

RNN 潜变量自回归模型 使用潜变量 h t h_t ht​ 总结过去信息 p ( h t ∣ h t − 1 , x t − 1 ) p(h_t | h_{t-1}, x_{t-1}) p(ht​∣ht−1​,xt−1​) p ( x t ∣ h t , x t − 1 ) p(x_t | h_t, x_{t-1}) p(xt​∣ht​,xt−1​) 循环神经网络 更新隐藏状态&#xff1…...

OpenCV的详细介绍与安装(一)

1.OpenCV概述 OpenCV是一个开源的计算机视觉和机器学习软件库&#xff0c; 它轻量级而且高效——由一系列 C 函数和少量 C 类构成&#xff0c;它支持多种编程语言&#xff08;如C、Python、Java&#xff09;&#xff0c;并可在Windows、Linux、macOS、Android和iOS等平台上运行…...

50、Spring Boot 详细讲义(七) Spring Boot 与 NoSQL

七 Spring Boot 与 NoSQL 目录 MongoDB 集成Redis 集成Elasticsearch 集成1、 MongoDB 集成 1.1 MongoDB 概述 1.1.1 MongoDB 的基本概念 文档型数据库: 数据存储为类似 JSON 的文档结构(BSON 格式)。每个文档由字段和值对组成,类似于键值对。支持嵌入式文档和数组,灵活…...

微信小程序组件传参

微信小程序组件传参感觉和vue还是挺像的 父组件向子组件传参 在小程序中父组件子组件传参&#xff0c;主要使用properties属性。演示下&#xff1a; 创建组件文件夹component&#xff0c;创建组件demoComponent&#xff0c;记得创建的时候选择组件&#xff0c;不是page页面 …...

C++实用函数:bind

本篇来介绍了C++中bind功能。 1 std::bind 在 C++ 里,std::bind 是一个函数模板,其作用是创建一个可调用对象,该对象可绑定到一组参数上。std::bind 的函数原型如下: template< class F, class... Args > /*unspecified*/ bind( F&& f, Args&&...…...

C# 程序结构||C# 基本语法

原文&#xff1a;C# 程序结构_w3cschool &#xff08;注&#xff1a;本文为教程文章&#xff0c;请勿标记为付费文章&#xff01;特此声明&#xff09; 本节我们将学习 C# 编程语言的结构&#xff0c;为了让大家能够对 C# 程序结构有个更好的理解&#xff0c;我们会先演示一个…...

分库分表-除了hash分片还有别的吗?

在分库分表的设计中,除了常见的 Hash 分片,还有多种策略根据业务场景灵活选择。以下是几种主流的分库分表策略及其应用场景、技术实现和优缺点分析,结合项目经验(如标易行投标服务平台的高并发场景)进行说明: 一、常见分库分表策略 1. 范围分片(Range Sharding) 原理:…...

单片机非耦合业务逻辑框架

在小型单片机项目开发初期&#xff0c;由于业务逻辑相对简单&#xff0c;我们往往较少关注程序架构层面的设计。 然而随着项目经验的积累&#xff0c;开发者会逐渐意识到模块间的耦合问题&#xff1a;当功能迭代时&#xff0c;一处修改可能引发连锁反应。 此时&#xff0c;构…...

WordPress - 此站点出现严重错误

本篇讲 当WordPress出现 此站点出现严重错误 时&#xff0c;该如何解决。 目录 1&#xff0c;现象 2&#xff0c; FAQ 3&#xff0c;管理Menu无法打开 下面是详细内容。 1&#xff0c;现象 此站点出现严重错误&#xff08;このサイトで重大なエラーが発生しました&#x…...

Java EE(8)——线程安全总结(翻新版)——定时器(Timer)线程池(ThreadPoolExecutor)

1.Timer 1.1Timer基本介绍 1.Timer的主要作用 任务调度&#xff1a;Timer允许你安排一个任务在未来的某个时间点执行&#xff0c;或者以固定的间隔重复执行 后台执行&#xff1a;Timer可以使用一个后台线程来执行任务&#xff0c;这意味着调度和执行任务不会阻塞主线程(主线程…...