Java EE 进阶:Spring IoCDI
IOC的简单介绍
什么是Spring?Spring是一个开源的框架,让我们的开发更加的简单,我们可以用一句更加具体的话来概括Spring,就是Spring是一个包含众多工具方法的IOC容器。
简单介绍一下IOC,我们之前说过通过@ReqestController和@Controller注解,把对象交给Spring管理,在启动Spring框架时,就会加载类交给Spring管理,这就是IOC思想。
IoC: Inversion of Control (控制反转),也就是说Spring是⼀个"控制反转"的容器。
控制反转
就是控制权反转,什么的控制权发⽣了反转? 获得依赖对象的过程被反转了 也就是说,当需要某个对象时,传统开发模式中需要⾃⼰通过new创建对象,现在不需要再进⾏创建, 把创建对象的任务交给容器, 程序中只需要依赖注⼊(DependencyInjection,DI)就可以了。
传统的开发思路
例如:造一辆小汽车
根据如下的代码:
public class Tire {int size;public Tire(Integer size){this.size=size;System.out.println("Tire size ="+size);}
}
public class Bottom {private Tire tire;public Bottom(Integer size){this.tire=new Tire(size);System.out.println("bootom size"+size);}
}
public class Framework {private Bottom bottom;public Framework(Integer size){this.bottom=new Bottom(size);System.out.println("framework size"+size);}
}
public class Car {private Framework framework;public Car(Integer size){this.framework=new Framework(size);System.out.println("car size"+size);}public void run(){System.out.println("car can run ");}
}
public class Main {static int size;public static void main(String[] args) {Car car=new Car(12);car.run();}
}
这样的代码维护性很低
如果我们把Tire类中构造方法的参数去掉,那么其他有关的调用程序就会报错,会连续报错一连串的错误,程序的耦合性很高,而我们写代码讲究高内聚,低耦合,所以这样的传统的开发思路已经不实用了
我们可以尝试一种新的设计思路
根据如下的代码:
public class Tire {int size;public Tire(Integer size){this.size=size;System.out.println("Tire size ="+size);}
}
public class Bottom {private Tire tire;public Bottom(Tire tire){this.tire=tire;System.out.println("bootom size"+tire.size);}
}
public class Framework {private Bottom bottom;public Framework(Bottom bottom){this.bottom=bottom;System.out.println("framework size");}
}
public class Car {private Framework framework;public Car(Framework framework){this.framework=framework;System.out.println("car size");}public void run(){System.out.println("car can run ");}
}
public class Main {static int size;public static void main(String[] args) {Tire tire=new Tire(12);Bottom bottom=new Bottom(tire);Framework framework=new Framework(bottom);Car car=new Car(framework);car.run();}
}
我们只需要将原先创建的下级类,改为传递的方法,这样我们在修改或者添加一些参数时,不需要重新修改创建的下级类,下级类也不会改变,这样我们就实现了解耦。
这部分代码就是IOC容器做的事情
DI(依赖注入)
容器在运⾏期间,动态的为应⽤程序提供运⾏时所依赖的资源,称之为依赖注⼊。(也可以说DI是IOC的一种实现)
IOC & DI的使用
Spring 容器管理的主要是对象,这些对象,我们称之为"Bean".我们把这些对象交由Spring管理,由 Spring来负责对象的创建和销毁.我们程序只需要告诉Spring,哪些需要存,以及如何从Spring中取出 对象
我们可以使用@Component注解和@Autowired注解来完成这个过程
import org.springframework.stereotype.Component;+
@Component
public class Tire {int size=12;public Tire(){System.out.println("Tire size ="+size);}
}import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component("/bottom4")
public class Bottom {private Tire tire;@Autowiredpublic Bottom(Tire tire){this.tire=tire;System.out.println("bootom size"+tire.size);}
}import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;+
@Component
public class Framework {private Bottom bottom;@Autowiredpublic Framework(Bottom bottom){this.bottom=bottom;System.out.println("framework size");}
}import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Car {private Framework framework;@Autowiredpublic Car(Framework framework){this.framework=framework;System.out.println("car size");}public void run(){System.out.println("car can run ");}
}import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
//在 Spring 框架中,Bean 是指 Spring 容器 中的一个对象。
// 简单来说,Spring 管理的任何对象都可以被称为 Bean。
// 这些对象由 Spring 容器 创建、初始化、管理,并根据需要进行生命周期管理。
@SpringBootApplication
public class Main {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(Main.class, args);// 获取 Spring 管理的 BeanCar car = context.getBean(Car.class);car.run();}
}
IOC详解
bean的存储
共有两类注解类型可以实现:
类注解:@Controller @Component @Configuration @Repository @Service
方法注解:@Bean
@Controller(控制器存储)
注:记得在对象前加@Controller注解
用原始的方法获取对象其中的方法
public class HelloController {public void print(){System.out.println("controller");}
}
public class DemoApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(DemoApplication.class, args);//用原始的方法来获得对象及其中的方法HelloController helloController=new HelloController();helloController.print();
}
利用@controller来获取bean对象的三种方法
1.根据bean的名称来获取bean
@Controller("controller")
public class HelloController {public void print(){System.out.println("controller");}
HelloController bean=(HelloController) context.getBean("controller");bean.print();
2.根据bean的类型来获取bean
@Controller("controller")
public class HelloController {public void print(){System.out.println("controller");}
HelloController bean2=context.getBean(HelloController.class);bean2.print();
3.根据bean的名称和方法来获取bean
@Controller("controller")
public class HelloController {public void print(){System.out.println("controller");}
HelloController bean3=context.getBean("controller",HelloController.class);bean3.print();
运行结果:
当然还有其他的方法
注:bean的名称使用小驼峰的写法
@Service(服务储存)
利用@Service存储bean
@Service
public class UseService {public void print(){System.out.println("service");}
}@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(DemoApplication.class, args);UseService bean6 = context.getBean(UseService.class);bean6.print();
}
@Repository(仓库存储)
利用@Repository存储bean
@Repository
public class UseRepository {public void print(){System.out.println("repository");}
}@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(DemoApplication.class, args);UseRepository bean7 = context.getBean(UseRepository.class);bean7.print();
}
@Component(组件存储)
利用@Component存储bean
@Component
public class UseComponent {public void print(){System.out.println("component");}
}@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(DemoApplication.class, args);UseComponent bean4 = context.getBean(UseComponent.class);bean4.print();
}
@Configuration(配置存储)
利用@Configuration存储bean
@Configuration
public class UseConfiguration {public void print(){System.out.println("configuration");}
}@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(DemoApplication.class, args);UseConfiguration bean5 = context.getBean(UseConfiguration.class);bean5.print();
}
注解的作用
@Controller:控制层,接收请求,对请求进⾏处理,并进⾏响应.
@Servie:业务逻辑层,处理具体的业务逻辑.
@Repository:数据访问层,也称为持久层.负责数据访问操作
@Configuration:配置层.处理项⽬中的⼀些配置信息.
程序的应用分层,调用方式
通过看这些注解的源码,我们发现这些注解中都有@Component注解,都是其子类
方法注解@Bean
注:方法注解要配合类注解才可以正常的存储到Spring容器中
@Component
public class StudentComponent {@Beanpublic Student stu1(){return new Student("zs",12);}
}@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(DemoApplication.class, args);Student bean8 =(Student) context.getBean(Student.class);System.out.println(bean8);
}
如果是多个对象的时候
@Component
public class StudentComponent {@Beanpublic Student stu1(){return new Student("zs",12);}@Beanpublic Student stu2(){return new Student("xx",5);}@Bean(name={"stu4","stu5"})public Student stu3(){return new Student("lisi",14);}
}@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(DemoApplication.class, args);Student bean8 =(Student) context.getBean(Student.class);System.out.println(bean8);
}
我们可以根据名称来获取对象
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(DemoApplication.class, args);Student bean8 =(Student) context.getBean("stu1");System.out.println(bean8);
}
我们也可以对Bean进行重命名
@Bean(name={"stu4","stu5"})
路径的扫描
启动类的默认扫描路径为启动类所在的包及其子类,可以在启动类中看到扫描的路径
我们可以通过 @ComponentScan 来配置启动类的扫描路径
@ComponentScan("在里面写路径,为开始项的路径,开始项的默认路径为本类的路径")
也可以使用数组的写法
例如
@ComponentScan({"com.blame.ioc.service", "com.blame.ioc.component"})
DI详解
依赖注入
1.属性注入
是@Autowired注解实现的,将UserService类和UserConfiguration注⼊到HelloController类中
@Controller("controller")
public class HelloController {//属性的注入@Autowiredprivate UseService useService;@Autowiredprivate UseConfiguration useConfiguration;public void print(){System.out.println("controller");useService.print();useConfiguration.print();}
}@Configuration
public class UseConfiguration {public void print(){System.out.println("configuration");}
}@Service
public class UseService {public void print(){System.out.println("service");}
}@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(DemoApplication.class, args);UseService service=context.getBean(UseService.class);service.print();UserController userController=context.getBean(UserController.class);userController.print();
}
2.构造方法注入
@Controller("controller")
public class HelloController {//构造方法注入private UseService useService;private UseConfiguration useConfiguration;public HelloController() {}public HelloController(UseService useService) {this.useService = useService;}@Autowiredpublic HelloController(UseService useService, UseConfiguration useConfiguration) {this.useService = useService;this.useConfiguration = useConfiguration;}public void print(){System.out.println("controller");useService.print();useConfiguration.print();}
}@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(DemoApplication.class, args);UseService service=context.getBean(UseService.class);service.print();UserController userController=context.getBean(UserController.class);userController.print();
}
注:如果只要一个构造方法,在构造方法前不用加@Autowired,但是如果是多个构造方法,必须加@Autowired,否则无法识别用哪个构造方法
3.Setter注入
@Controller("controller")
public class HelloController {//Setter方法的注入private UseService useService;private UseConfiguration useConfiguration;@Autowiredpublic void setUseService(UseService useService) {this.useService = useService;}@Autowiredpublic void setUseConfiguration(UseConfiguration useConfiguration) {this.useConfiguration = useConfiguration;}public void print(){System.out.println("controller");useService.print();useConfiguration.print();}
}
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(DemoApplication.class, args);UseService service=context.getBean(UseService.class);service.print();UserController userController=context.getBean(UserController.class);userController.print();
}
注:在每一Setter方法前都要加@Autowired注解
当同⼀类型存在多个bean时,使⽤@Autowired会存在问题
@Component
public class StudentComponent {@Beanpublic Student stu1(){return new Student("zs",12);}@Beanpublic Student stu2(){return new Student("xx",5);}@Bean(name={"stu4","stu5"})public Student stu3(){return new Student("lisi",14);}
}@Controller
public class UserController {@Autowiredprivate Student stu;public void print(){System.out.println("UserController");System.out.println();}
}
就会报错,错误信息为不是唯一的bean
并且给你解决的方法,使用@Primary注解或者@Qualifier注解
@Primary
使⽤@Primary注解:当存在多个相同类型的Bean注⼊时,加上@Primary注解,来确定默认的实现
@Component
public class StudentComponent {@Primary@Beanpublic Student stu1(){return new Student("zs",12);}@Beanpublic Student stu2(){return new Student("xx",5);}@Bean(name={"stu4","stu5"})public Student stu3(){return new Student("lisi",14);}
}
@Qualifier
使⽤@Qualifier注解:指定当前要注⼊的bean对象。
注:@Qualifier注解不能单独使用,必须配合@Autowired注解使用。
@Controller
public class UserController {@Qualifier("stu1")@Autowiredprivate Student stu;public void print(){System.out.println("UserController");System.out.println();}
}
@Resource
使用@Resource注解也可以解决这个问题
@Controller
public class UserController {@Resource(name = "stu1")private Student stu;public void print(){System.out.println("UserController");System.out.println();}
}
@Autowird与@Resource的区别
1.@Autowird是按类型注入,而@Resource是按名称进行注入。
2.@Autowired是spring框架提供的注解,⽽@Resource是JDK提供的注解
总结一下吧!
简单说一下Spring, Spring Boot和SpringMVC的关系以及区别
Spring 是基础框架,Spring MVC 是 Spring 提供的一种 Web 开发方式(模块),Spring Boot 是简化 Spring 应用开发和部署的工具和框架(整合+自动配置)
我们可以把这三者的关系比作开一家餐厅
Spring就是这家餐厅的基础设施:桌子,椅子,电,水,人员管理。
Spring MVC就是这家餐厅的点餐系统和前台的服务人员。
Spring Boot就相当于这个餐厅的加盟系统,任何东西都给你提供好了,你只需要做菜和开门营业就行了。
希望能对大家有所帮助!!!
相关文章:
Java EE 进阶:Spring IoCDI
IOC的简单介绍 什么是Spring?Spring是一个开源的框架,让我们的开发更加的简单,我们可以用一句更加具体的话来概括Spring,就是Spring是一个包含众多工具方法的IOC容器。 简单介绍一下IOC,我们之前说过通过ReqestContr…...
蓝桥杯备考:图论初解
1:图的定义 我们学了线性表和树的结构,那什么是图呢? 线性表是一个串一个是一对一的结构 树是一对多的,每个结点可以有多个孩子,但只能有一个父亲 而我们今天学的图!就是多对多的结构了 V表示的是图的顶点集…...
JVM类加载器面试题及原理
JVM只会运行二进制文件,类加载器的作用就是将字节码文件加载到JVM中,从而让Java程序能够启动起来。 1. 类加载器的种类 启动类加载器(BootStrap ClassLoader):加载JAVA_HOME/jre/lib目录下的库扩展类加载器ÿ…...
《V8 引擎狂飙,Node.js 续写 JavaScript 传奇》
”你没想过也许是这个镇子对你来说太小了吗? 对我而言,这个小镇容不下我的雄心壮志。 “ 什么是 Node.js? Node.js是一个跨平台JS运行环境,使开发者可以搭建服务器端的JS应用程序 作用:使用 Node.js 编写服务器端程序…...
关于Springboot 应配置外移和Maven个性化打包一些做法
期望达到的效果是每次更新服务器端应用只需要更新主程序jar 依赖jar单独分离。配置文件独立存放于文件夹内,更新程序并不会覆盖已有的配置信息。 一、配置外移 1、开发环境外移 做法:在项目同级或者上级创建config文件夹放置配置文件,具体m…...
Lab18_ SQL injection with filter bypass via XML encoding
文章目录 前言:进入实验室构造 payload 前言: 实验室标题为: 通关 XML 编码绕过过滤器的 SQL 注入 简介: 此实验室的库存检查功能中存在 SQL 注入漏洞。查询结果在应用程序的响应中返回,因此您可以使用 UNION 攻击…...
网络空间安全(21)验证码安全
一、基本概念 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。它通过…...
DMA在STM32中的应用
在STM32微控制器中,DMA(直接内存访问)是实现高效数据搬运的核心技术,能够显著减轻CPU负担并提升系统性能。以下是STM32中DMA的典型应用及配置方法: 1. STM32的DMA控制器架构 DMA控制器数量:不同系列配置不同,如STM32F1系列有1个DMA控制器(DMA1,7通道),F4系列有2个(…...
V8引擎中的垃圾回收机制如何工作?
V8引擎中的垃圾回收机制主要通过分代回收和增量标记清除算法来管理内存。以下是其工作原理的详细说明: V8 的垃圾回收机制基于以下核心设计原则: 1. 分代假设:大多数对象的生命周期很短,只有少数对象会存活较长时间;…...
汇编的伪指令
一、介绍 伪指令是用于对汇编过程进行控制的指令,该类指令并不是可执行指令,没有对应机器码,只用于汇编过程中为汇编程序提供汇编信息,帮助编译器编译。当汇编结束时,伪指令的使命也就结束了。伪操作可以实现如下功能…...
【TI】如何更改 CCS20.1.0 的 WORKSPACE 默认路径
参考链接: 如何更改 CCS Theia 中工作区的默认位置?- Code Composer Studio 论坛 - Code Composer Studio™︎ - TI E2E 支持论坛 --- How to change the default location for the workspace in CCS Theia? - Code Composer Studio forum - Code Comp…...
GStreamer —— 2.13、Windows下Qt加载GStreamer库后运行 - “教程13:播放控制“(附:完整源码)
运行效果(音频) 简介 上一个教程演示了GStreamer工具。本教程介绍视频播放控制。快进、反向播放和慢动作都是技术 统称为 Trick Modes,它们都有一个共同点 修改 Normal playback rate。本教程介绍如何实现 这些效果并在交易中添加了帧步进。特别是,它 显…...
推荐一款好用在线免费软件工具箱-传道软件箱
推荐一款好用在线免费软件工具箱-传道软件箱 传道软件箱 传道软件箱是一款在线免费软件工具箱,无需登录,无需费用,用完就走的软件工具,包有BMI计算、倒计时、单位转换、密码生成器、摩斯电码、代码编辑器、计算器、快递查询、二维…...
机器学习数学基础:40.结构方程模型(SEM)中卡方值与卡方自由度比
结构方程模型(SEM)中卡方值与卡方自由度比教程 在结构方程模型分析里,卡方值和卡方自由度比是评估模型拟合程度的重要指标,下面为大家详细介绍。 一、卡方值(CMIN) (一)基本概念与…...
【JavaEE进阶】Spring AOP详解
目录 🍃什么是AOP 🌳什么是Spring AOP 🌴上手Spring AOP 🚩引入依赖 🚩编写AOP程序 🎍Spring AOP核心概念 🚩切点(Pointcut) 🚩连接点(Join Point) 🚩通知(Advi…...
Docker 的基本概念和优势,以及在应用程序开发中的实际应用
Docker 是一种开源的容器化平台,让开发人员能够打包、发布和运行应用程序在轻量级、可移植的容器中。Docker 容器包含应用程序的代码、运行时环境、系统工具、系统库等,使得应用程序能在任何环境中快速部署和运行。 Docker 的基本概念包括以下几点&…...
python flask
安装 pip install flask 查看版本 pip show flask 启动服务器 设置环境变量,在控制台执行命令,app.py是创建的文件名 windows set FLASK_APPapp.py mac/linux export FLASK_APPapp.py 启动内置web服务器,注意要进入到app.py所在的文…...
关于tomcat使用中浏览器打开index.jsp后中文显示不正常是乱码,但英文正常的问题
如果是jsp文件就在首行加 “<% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" %>” 如果是html文件 在head标签加入: <meta charset"UTF-8"> 以jsp为例子,我们…...
双向选择排序算法
一 概述 双向选择排序(又称鸡尾酒选择排序)是选择排序的优化版本,核心改进在于每轮遍历同时确定未排序部分的最小值和最大值,分别交换到序列两端,从而减少遍历轮数。 二 时间复杂度 时间复杂度为(O(n^2)),但实际比较次数约为标准选择排序的 (1/2)。 三 C++实现代…...
P8662 [蓝桥杯 2018 省 AB] 全球变暖--DFS
P8662 [蓝桥杯 2018 省 AB] 全球变暖--dfs 题目 解析讲下DFS代码 题目 解析 这道题的思路就是遍历所有岛屿,判断每一块陆地是否会沉没。对于这种图的遍历,我们首先应该想到DFS。 代码的注意思想就是,在主函数中遍历找出所有岛屿,…...
2-kafka集群环境搭建
本文介绍kafka集群环境的搭建,我利用三个虚拟机搭建。文中我一步步演示了过程中可能会碰到的问题,在文章的最后,利用jmx,能看到详细的各个kafka broker的运行情况。 -1、环境 ubuntu :22.04-ltskafka: 2.8java: 17 …...
ROS2与Navigation2入门教程:构建与安装Nav2
Navigation2(Nav2)是ROS2中用于机器人导航的核心框架,支持路径规划、避障、SLAM等功能。本教程将详细介绍Nav2的安装与构建方法,涵盖二进制安装、源码编译及Docker部署等多种方式,适用于不同开发需求。 一、通过APT安…...
MySQL入门手册
MySQL入门手册:从零开始掌握数据库管理 📖 一、MySQL是什么? MySQL 是一个开源的关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,现隶属于Oracle旗下。它使用**结构化查询语言ÿ…...
深度学习算法实战——风格迁移(主页有源码)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 领域介绍 风格迁移(Style Transfer)是深度学习中的一个热门应用,旨在将一幅图像的风格迁移到…...
基于SpringBoot的智能问诊系统设计与隐私保护策略
通过SpringBoot框架,我们可以快速搭建一个智能问诊系统,为用户提供便捷的线上医疗服务。然而,在系统设计和实现过程中,如何保障用户的隐私和数据安全,始终是一个亟需关注的问题。本文将探讨基于SpringBoot的智能问诊系…...
开发ai模型最佳的系统是Ubuntu还是linux?
在 AI/ML 开发中,Ubuntu 是更优选的 Linux 发行版,原因如下: 1. 开箱即用的 AI 工具链支持 Ubuntu 预装了主流的 AI 框架(如 TensorFlow、PyTorch)和依赖库,且通过 apt 包管理器可快速部署开发环境。 提…...
Vue 3 ref(new Map()) 无法触发watch
现象 const map ref(new Map()); 通过 map.value.set(k, v); 不能触发watch 下面验证,map.value.set 并不能触发watch 的监听 代码 <script setup lang"ts"> import { ref, triggerRef, watch } from vue;const map ref(new Map<string, R…...
NoteGen是一款开源跨平台的 AI 笔记应用,专注于 recording 和 writing ,基于 Tauri 开发
一、软件介绍 文末提供程序和源码下载 NoteGen 是一款专注于记录和写作的跨平台 AI 笔记应用,基于 Tauri 开发。NoteGen 的核心理念是将记录、写作和 AI 结合使用,三者相辅相成。记录功能可以帮助用户快速捕捉和整理碎片化知识。整理功能是连接记录和写…...
repo访问gerrit.googlesource失败
编译openharmony的时候,repo阶段碰到一个问题,建议不要通过 apt install安装,里面的源来自google curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o ~/repo chmod 755 ~/repo 执行类似这样的操作 repo init -u gitgitee.com:…...
IDEA中Git版本回退终极指南:Reset与Revert双方案详解
目录 前言一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提交历史1.2、选择目标版本1.3、选择回退模式1.3.1、Soft(推荐)1.3.2、Mixed1.3.3、Hard(慎用)1.3.…...
【系统架构设计师】体系结构复审
目录 1. 说明2. 例题2.1 例题1 1. 说明 1.体系结构设计、文档化和复审是一个迭代过程。2.从这个方面来说,在一个主版本的软件体系结构分析之后,要安排一次由外部人员(用户代表和领域专家)参加的复审。3.鉴于体系结构文档标准化以…...
Unity之如何实现哔哩哔哩直播弹幕游戏
前言 什么是直播间互动? 当我们使用哔哩哔哩进行直播或者观看视频时,我们可以通过接入哔哩哔哩提供的 直播&互动玩法SDK,让直播和视频可以与Unity3D游戏客户端或者游戏服务器进行互动。 环境要求 Unity 2020.x或更高版本 依赖库:Newtonsoft Json Unity Package 在P…...
视觉图像处理
在MATLAB中进行视觉图像处理仿真通常涉及图像增强、滤波、分割、特征提取等操作。以下是一个分步指南和示例代码,帮助您快速入门: 1. MATLAB图像处理基础步骤 1.1 读取和显示图像 % 读取图像(替换为实际文件路径) img = imread(lena.jpg); % 显示原图 figure; subplot(2…...
学习LED驱动知识(二)
ppt来自B站周老师 使用普通元器件或者电源芯片构建电路驱动LED 1.电阻降压限流设计 案例一: USB供电电压为5V,因为LED的Vf为3v,所以电路只能6个LED并联,直接跟电源并联电流太大,LED会过流导致断路。所以要先串联一个…...
011---UART协议的基本知识(一)
1. 摘要 文章为学习记录。主要介绍 UART 协议的概述、物理层、协议层、关键参数。 2. UART概述 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART(串口),是一种异步****串…...
如何选择开源向量数据库
文章目录 评估维度查询性能索引与存储扩展性数据管理能力生态支持 常见向量数据库对比 评估维度 选择开源向量数据库时,需要综合考虑查询性能、数据规模、索引构建速度、生态支持等多个因素,以下是关键的评估维度:选择开源向量数据库时&…...
SpringBoot项目配置文件
SpringBoot项目提供了多种属性配置方式(properties、yaml、yml) yml配置文件 使用Apifox可以方便开发接口、前端测试等 工程搭建: 1.创建SpringBoot工程,并引入web开发起步依赖、mybatis、mysql驱动、lombok 2.创建数据库表&am…...
L33.【LeetCode笔记】循环队列(数组解法)
目录 1.题目 2.分析 方法1:链表 尝试使用单向循环链表模拟 插入节点 解决方法1:开辟(k1)个节点 解决方法2:使用变量size记录队列元素个数 获取队尾元素 其他函数的实现说明 方法2:数组 重要点:指针越界的解决方法 方法1:单独判断 方法2:取模 3.数组代码的逐步实现…...
前端知识点---库和包的概念
1. 什么是库(Library)? 库(Library) 是一组可复用的代码集合,提供特定功能(如网络请求、UI 组件、数据处理等)。 特点: 只是代码的集合,没有完整的应用结构…...
【CSS3】筑基篇
目录 复合选择器后代选择器子选择器并集选择器交集选择器伪类选择器 CSS 三大特性继承性层叠性优先级 背景属性背景色背景图背景图平铺方式背景图位置背景图缩放背景图固定背景复合属性 显示模式显示模式块级元素行内元素行内块元素 转换显示模式 结构伪类选择器结构伪类选择器…...
CentOS7 安装docker并配置镜像加速
一、Yum 安装docker【不推荐】 /var/lib/docker 路径主要用于存储容器数据,在使用和操作过程中数据量会逐渐增加。因此,在生产环境中,建议为 /var/lib/docker 单独挂载一个硬盘。也可以使用软连接的方式 1.1 安装必要的一些系统工具 yum i…...
【Go每日一练】统计字符出现的次数
👻创作者:丶重明 👻创作时间:2025年3月9日 👻擅长领域:运维 目录 1.😶🌫️题目:2.😶🌫️资源:3.😶🌫️代…...
正向代理与反向代理
代理: 通常称为代理、代理服务器或 Web 代理,代理一般是指正向代理,是位于一组客户端计算机之前的服务器。当这些计算机向 Internet 上的站点和服务发出请求时,代理服务器将拦截这些请求,然后代表客户端与 Web服务器进行通信&…...
报表DSL优化,享元模式优化过程,优化效果怎么样?
报表DSL优化与享元模式应用详解 一、报表DSL优化 1. 问题背景 报表系统通常使用领域特定语言(DSL)定义模板结构、数据绑定规则及样式配置。随着复杂度提升,DSL可能面临以下问题: 冗余配置:重复定义样式、布局或数据源…...
双击PPT文件界面灰色不可用,需要再次打开该PPT文件才能正常打开
双击PPT文件界面灰色不可用,需要再次打开该PPT文件才能正常打开 1. 软件环境⚙️2. 问题描述🔍3. 解决方法🐡解决步骤 4. 结果预览🤔 1. 软件环境⚙️ Windows10 或 Windows11 专业版64位,安装MotionGo软件(…...
学习前置知识第18和19天
今天要做什么? 1:显示数字要求格式 2:无符号除法指令:div 3:前面用vhd和img等格式进行系统界面启动,详细了解多种镜像格式文件的区别 一:显示数字要求格式 屏幕上显示的数字格式,三个颜色编码和数字属性 1&…...
C#运算符详解
一、运算符分类与功能 1.算术运算符 基本运算:(加)、-(减)、*(乘)、/(除)、%(取模) int a 10 / 3; // 结果为3(整数除…...
生成任务,大模型
一个生成项目 输入:文字描述(但是给的数据集是一串数字,id,ct描述,医生描述) 输出:诊断报告 一、数据处理 import pandas as pd #处理表格数据pre_train_file "data/train.csv"tr…...
下载Hugging Face模型的几种方式
1.网页下载 直接访问Hugging Face模型页面,点击“File and versions”选项卡,选择所需的文件进行下载。 2.使用huggingface-cli 首先,安装huggingface_hub: pip install huggingface_hub 然后,使用以下命令下载模型࿱…...
【Elasticsearch入门到落地】9、hotel数据结构分析
接上篇《8、RestClient操作索引库-基础介绍及导入demo》 上一篇我们介绍了RestClient的基础,并导入了使用Java语言编写的RestClient程序Demo以及将要分析的数据库。本篇我们就要分析导入的宾馆数据库tb_hotel表结构的具体含义,并分析如何建立其索引库。 …...