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

【Spring】IoC详解:五大类注解、类Bean的存储(上)

1.IoC本质

IoC(Inversion of Control,控制反转) 是Spring框架的灵魂,它颠覆了传统编程中“谁用谁造”的逻辑。简单来说,IoC就是把对象创建和管理的控制权从程序员手中“反转”给一个外部容器,让代码更灵活、更松散。

在生活中,IoC的影子无处不在。比如你去电影院看电影,传统方式是你自己带投影仪、幕布、音响,忙得焦头烂额;而现在,你买张票,影院把一切准备好,你只管享受。IoC就像这个“影院”,它接管了资源的准备工作,你只负责使用。

在编程中,传统方式是你手动new对象、管理依赖;而IoC下,容器替你完成这些,控制权反转,程序员从“主动干活”变成“被动接收”。

2.类Bean的存储

2.1存储的方式

在之前的⼊⻔案例中,要把某个对象交给IOC容器管理,需要在类上添加⼀个注解:@Component,而Spring框架为了更好的服务web应⽤程序, 提供了更丰富的注解(五大类注解)。

类注解用于标记一个类,表示它将被IoC容器管理,成为一个“Bean”(Spring中受管理的对象)。常见的类注解包括

  • @Controller:用于Web层,表示这是一个控制器类,负责处理用户请求。
  • @Service:用于业务逻辑层,表示这是一个服务类,封装核心业务逻辑。
  • @Repository:用于数据访问层,表示这是一个数据操作类,通常与数据库交互。
  • @Configuration:用于配置类,通常定义Bean或配置Spring的运行环境。
  • @Component:通用的基础注解,适用于任何需要被容器管理的类,是其他类注解的“父类”。

这些注解本质上告诉Spring:“嘿,这个类交给你管吧!”容器会根据注解自动创建实例并管理其生命周期。

除了类注解,Spring还提供了方法注解"@Bean",通常用在@Configuration标记的配置类中。它允许你在方法中自定义Bean的创建逻辑。

这里,@Bean告诉Spring:“这个方法会返回一个Bean,帮我管理它。”容器会调用这些方法,创建并组装对象。

2.2 获取Bean

举例:

在Controller类上添加@Controller:该类放入IoC容器中,成为Bean

@Controller
public class UserController {public void doUserController(){System.out.println("douserController...");}
}

从容器中获取Bean:

@SpringBootApplication
public class Test1Application {public static void main(String[] args) {// 获取上下文ApplicationContext context = SpringApplication.run(Test1Application.class, args);//获取UserControler的BeanUserController userController = context.getBean(UserController.class);userController.doUserController();//使用UserController的Bean方法}}

ApplicationContext 翻译过来就是: Spring 上下文

因为对象都交给 Spring 管理了,所以获取对象要从 Spring 中获取,那么就得先得到 Spring 的上下文

关于上下⽂的概念:

上学时, 阅读理解经常会这样问: 根据上下⽂, 说⼀下你对XX的理解
在计算机领域, 上下⽂这个概念, 咱们最早是在学习线程时了解到过, ⽐如我们应⽤进⾏线程切换的时候,切换前都会把线程的状态信息暂时储存起来,这⾥的上下⽂就包括了当前线程的信息,等下次该线程⼜得到CPU时间的时候, 从上下⽂中拿到线程上次运⾏的信息这个上下⽂, 就是指当前的运⾏环境, 也可以看作是⼀个容器, 容器⾥存了很多内容, 这些内容是当前运⾏的环境

ApplicationContext 也提供了其他获取bean的⽅式, ApplicationContext 获取bean对象的功能, 是⽗类BeanFactory提供的功能.

public interface BeanFactory { //以上省略...// 1. 根据bean名称获取beanObject getBean(String var1) throws BeansException;// 2. 根据bean名称和类型获取bean<T> T getBean(String var1, Class<T> var2) throws BeansException;// 3. 按bean名称和构造函数参数动态创建bean,只适⽤于具有原型(prototype)作⽤域的beanObject getBean(String var1, Object... var2) throws BeansException;// 4. 根据类型获取bean<T> T getBean(Class<T> var1) throws BeansException;// 5. 按bean类型和构造函数参数动态创建bean, 只适⽤于具有原型(prototype)作⽤域的bean<T> T getBean(Class<T> var1, Object... var2) throws BeansException; 15//以下省略...}

常⽤的是上述1,2,4种, 这三种⽅式,获取到的bean是⼀样的

其中1,2种都涉及到根据名称来获取对象. bean的名称是什么呢?

Spring中,bean是Spring框架在运⾏时管理的对象, Spring会给管理的对象起⼀个名字.

⽐如学校管理学⽣, 会给每个学⽣分配⼀个学号, 根据学号, 就可以找到对应的学⽣.Spring也是如此, 给每个对象起⼀个名字, 根据Bean的名称(BeanId)就可以获取到对应的对象.

Bean 命名约定,我们看下官方文档的说明:
在这里插入图片描述

程序开发⼈员不需要为bean指定名称(BeanId), 如果没有显式的提供名称(BeanId),Spring容器将为该 bean⽣成唯⼀的名称.
命名约定使⽤Java标准约定作为实例字段名. 也就是说,bean名称以⼩写字⺟开头,然后使⽤驼峰式⼤⼩写.

⽐如:
类名: UserController, Bean的名称为: userController
类名: AccountManager, Bean的名称为: accountManager类名: AccountService, Bean的名称为: accountService

也有⼀些特殊情况, 当有多个字符并且第⼀个和第⼆个字符都是⼤写时, 将保留原始的⼤⼩写. 这些规则与java.beans.Introspector.decapitalize (Spring在这⾥使⽤的)定义的规则相同.
⽐如:
类名: UController, Bean的名称为: UController类名: AManager, Bean的名称为: AManager

根据命名规则来获取Bean

@SpringBootApplication
public class Test1Application {public static void main(String[] args) {// 获取上下文ApplicationContext context = SpringApplication.run(Test1Application.class, args);//从Spring上下⽂中获取对象//根据bean类型, 从Spring上下⽂中获取对象UserController userController1 = context.getBean(UserController.class);//根据bean名称, 从Spring上下⽂中获取对象UserController userController2 = (UserController) context.getBean("userController");//根据bean类型+名称, 从Spring上下⽂中获取对象UserController userController3 = context.getBean("userController",UserController.class);//执行Bean的方法userController1.doUserController();userController2.doUserController();userController3.doUserController();}}

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

从上可以得知,打印的地址是相同的,不同方式获取到的Bean是相同的。

地址⼀样, 说明对象是⼀个
获取bean对象, 是⽗类BeanFactory提供的功能

ApplicationContext VS BeanFactory(常见面试题):

  • 继承关系和功能方面来说:Spring 容器有两个顶级的接⼝:BeanFactory 和ApplicationContext。其中 BeanFactory 提供了基础的访问容器的能⼒,⽽ ApplicationContext 属于 BeanFactory 的⼦类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化⽀持、资源访问⽀持、以及事件传播等⽅⾯的⽀持.
  • 从性能方面来说:ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,⽽ BeanFactory 是需要那个才去加载那个,因此更加轻量. (空间换时间)

2.3 类注解–举例

2.3.1 @Controller注解

在Controller类上添加@Controller:该类放入IoC容器中,成为Bean

@Controller
public class UserController {public void doUserController(){System.out.println("douserController...");}
}

如何观察这个对象已经存在Spring容器当中了呢? 接下来从Spring容器中获取对象

@SpringBootApplication
public class Test1Application {public static void main(String[] args) {// 获取上下文ApplicationContext context = SpringApplication.run(Test1Application.class, args);//获取UserControler的BeanUserController userController = context.getBean(UserController.class);userController.doUserController();//使用UserController的Bean方法}}

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

把@Controller注释,再次运行:

//@Controller
public class UserController {public void doUserController(){System.out.println("douserController...");}
}

运行时发生报错:
在这里插入图片描述

2.3.2 @service注解

使用 @Service 存储 bean 的代码如下所示:

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

从容器中获取Bean:

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

运行后的结果:
在这里插入图片描述
如果把@Service注解,运行时会报错

2.3.3 @Repository

使用 @Repository 存储 bean 的代码如下所示:

@Repository
public class UserRepository {public void daoUserRepository(){System.out.println("doUserRepository...");}
}

从容器中获取Bean:

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

运行结果:
在这里插入图片描述
把@Repository注解,运行发生报错

2.3.4 @Component

使用 @Component 存储 bean 的代码如下所示:

@Component
public class UserComponent {public void doUserComponent(){System.out.println("doUserComponent...");}
}

从容器中获取Bean:

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

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

2.3.5 @Configuration

使用 @Configuration存储 bean 的代码如下所示:

@Configuration
public class UserConfiguration {public void doUserConfiguration(){System.out.println("doUserConfiguration...");}
}

从容器中获取Bean:

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

运行结果:
在这里插入图片描述
把@Configuration注解,运行时会发生报错

3.为什么有多个类注解?

这与应用分层相关联,后端会有很多功能的类,为了让让程序员看到类注解之后,就能直接了解当前类的⽤途,就设置了很多个类注解。另外,类注解也会限制类功能。

@Controller:控制层, 接收请求, 对请求进⾏处理, 并进⾏响应.
@Servie:业务逻辑层, 处理具体的业务逻辑.
@Repository:数据访问层,也称为持久层. 负责数据访问操作
@Configuration:配置层. 处理项⽬中的⼀些配置信息.
@Component:通用的基础注解,适用于任何需要被容器管理的类,是其他类注解的“父类”。

这和每个省/市都有⾃⼰的⻋牌号是⼀样的.
⻋牌号都是唯⼀的, 标识⼀个⻋辆的. 但是为什么还需要设置不同的⻋牌开头呢.
⽐如陕西的⻋牌号就是:陕X:XXXXXX,北京的⻋牌号:京X:XXXXXX,甚⾄⼀个省不同的县区也是不同的,⽐如西安就是,陕A:XXXXX,咸阳:陕B:XXXXXX,宝鸡,陕C:XXXXXX,⼀样.

这样做的好处除了可以节约号码之外,更重要的作⽤是可以直观的标识⼀辆⻋的归属地.程序的应⽤分层,调⽤流程如下:

在这里插入图片描述
查看@Controller@ServiceConfiguration@Repository 注解的源码:
@Controller

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {@AliasFor(annotation = Component.class)String value() default "";}

@Service

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {@AliasFor(annotation = Component.class)String value() default "";}

Configuration

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {@AliasFor(annotation = Component.class)String value() default "";}

@Repository

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {@AliasFor(annotation = Component.class)String value() default "";boolean proxyBeanMethods() default true;}

进行对比:
在这里插入图片描述

其实这些注解⾥⾯都有⼀个注解@Component,说明它们本⾝就是属于@Component的"⼦类".

@Component是⼀个元注解,也就是说可以注解其他类注解,如@Controller@ServiceConfiguration@Repository 等. 这些注解被称为@Component的衍⽣注解。

@Controller@Service@Repository ⽤于更具体的⽤例(分别在控制层, 业务逻辑层, 持久化层), 在开发过程中,如果你要在业务逻辑层使⽤ @Component@Service,显然@Service是更好的选择

比如杯⼦有喝⽔杯, 刷⽛杯等, 但是我们更倾向于在⽇常喝⽔时使⽤⽔杯, 洗漱时使⽤刷⽛杯.

如果把与前端交互的Controller层的@Controller的注解换成@Service会怎么样呢?

示例:

@Controller
@RequestMapping("basic")
public class BasicController {@RequestMapping("/test")@ResponseBodypublic String test(){return "@Service";}}

使用@Controller注解,运行后的结果:
在这里插入图片描述

错误示例:

//@Controller
@Service
@RequestMapping("basic")
public class BasicController {@RequestMapping("/test")@ResponseBodypublic String test(){return "@Service";}
}

使用@Service注解,运行后的结果:
在这里插入图片描述

不推荐这样做
尽管这种方式“能用”,但在实际开发中不建议将 @Service 用于控制器层,主要有以下原因:

  1. 职责混乱:@Service 的语义是为业务逻辑层设计,处理 HTTP请求是 @Controller 的职责。用 @Service 替代 @Controller 会让代码意图不清晰,违背分层架构原则。
  2. 潜在风险: 如果项目中禁用了某些默认扫描或调整了 Spring MVC 的配置(如自定义 RequestMappingHandlerMapping),这种“意外支持”可能失效,导致请求无法处理。
  3. 可读性与维护性: 其他开发者看到 @Service 上的 @RequestMapping,会感到困惑,增加理解和维护成本。

正确的做法是使用 @Controller 或 @RestController(后者是 @Controller 和 @ResponseBody 的组合)

相关文章:

【Spring】IoC详解:五大类注解、类Bean的存储(上)

1.IoC本质 IoC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09; 是Spring框架的灵魂&#xff0c;它颠覆了传统编程中“谁用谁造”的逻辑。简单来说&#xff0c;IoC就是把对象创建和管理的控制权从程序员手中“反转”给一个外部容器&#xff0c;让代码更灵活…...

图片压缩后失真?3款工具还原高清细节

在当今&#xff0c;图片的使用无处不在。为了便于存储和传输&#xff0c;我们常常会对图片进行压缩。然而&#xff0c;不少人发现&#xff0c;压缩后的图片往往变得模糊&#xff0c;失去了原本的清晰度和细节。那么&#xff0c;当遇到这种情况时&#xff0c;我们该如何将模糊的…...

2025中国移动云智算大会|彩讯企业级AI应用产品引关注

2025中国移动以“由云向智&#xff0c;共绘算网新生态”为主题&#xff0c;精心打造了一场智能科技展。中国移动携手生态伙伴带来涵盖算力、工具、模型、应用等覆盖多样化场景的AI应用服务&#xff0c;赋能生产方式、生活方式、社会治理方式的数智化解决方案&#xff0c;充分释…...

在新一代人工智能技术引领下的,相互联系、层层递进的明厨亮灶开源了

明厨亮灶视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。AI技术可以24小时…...

修图自由!自建IOPaint服务器,手机平板随时随地远程调用在线P图

前言&#xff1a;在这个人人都想当摄影师的时代&#xff0c;一张完美的照片简直比中彩票还难。但别担心&#xff0c;今天我来给大家揭秘一个超级神器——IOPaint&#xff01;这款免费开源的AI工具不仅能一键移除照片中的杂物和路人&#xff0c;还能智能扩展图片内容&#xff0c…...

PyTorch实现二维卷积与边缘检测:从原理到实战

本文通过PyTorch实现二维互相关运算、自定义卷积层&#xff0c;并演示如何通过卷积核检测图像边缘。同时&#xff0c;我们将训练一个卷积核参数&#xff0c;使其能够从数据中学习边缘特征。 1. 二维互相关运算的实现 互相关运算&#xff08;Cross-Correlation&#xff09;是卷…...

解决Server doesn‘t support Accept-Ranges问题

Cannot download differentially, fallback to full download: Error: Server doesnt support Accept-Ranges (response code 200) 解决方案 修改nginx配置文件支持Accept-Ranges&#xff08;范围请求&#xff09; server {...location ^~/ {default_type multipart/byterang…...

处理Excel表不等长时间序列用tsfresh提取时序特征

我原本的时间序列格式是excel表记录的&#xff0c;每一行是一条时间序列&#xff0c;时间序列不等长。 要把excel表数据读取出来之后转换成extract_features需要的格式。 1.读取excel表数据 import pandas as pd import numpy as np from tsfresh import extract_features mda…...

Linux __命令和权限

目录 一、几个指令 bc uname -r 指令 重要的几个热键 二、Shell命令以及运行原理 为什么有外壳 外壳是如何工作的 什么是操作系统&#xff0c;为什么要有操作系统 三、文件类型 1、Linux的文件类型 2、文件类型 四、用户 用户问题和切换问题 增加普通用户 root -&…...

IO流——字符输入输出流:FileReader FileWriter

一、文件字符输入流&#xff1a;FileReader 作用&#xff1a;以内存为基准&#xff0c;可以把文件中的数据以字符的形式读入到内存中去 public class Test5 {public static void main(String[] args) {try (Reader fr new FileReader("E:\\IDEA\\JavaCodeAll\\file-io-t…...

【大模型理论篇】DeepResearcher论文分析-通过在真实环境中的强化学习实现深度研究

1. 背景与问题 大模型&#xff08;LLMs&#xff09;配合网络搜索功能已经展现出在深度研究任务中的巨大潜力。然而&#xff0c;目前的方法主要依赖两种途径&#xff1a; 人工设计的提示工程&#xff08;Prompt Engineering&#xff09;&#xff1a;这种方法依靠手动设计的工作流…...

大数据(7.5)Kafka Edge在5G边缘计算中的革新实践:解锁毫秒级实时处理的无限可能

目录 一、5G时代边缘计算的算力革命1.1 传统架构的延迟困境1.2 5G网络特性与Kafka适配 二、Kafka Edge核心架构设计2.1 分层处理架构2.2 关键技术创新点2.2.1 协议优化2.2.2 轻量化存储引擎 三、5G场景落地实践3.1 智能工厂预测性维护3.2 全息远程医疗会诊 四、性能优化深度实践…...

【基于开源insightface的人脸检测,人脸识别初步测试】

简介 InsightFace是一个基于深度学习的开源人脸识别项目,由蚂蚁金服的深度学习团队开发。该项目提供了人脸检测、人脸特征提取、人脸识别等功能,支持多种操作系统和深度学习框架。本文将详细介绍如何在Ubuntu系统上安装和实战InsightFace项目。 目前github有非常多的人脸识…...

kafka怎么保证消息不被重复消费

在 Kafka 中&#xff0c;要保证消息不被重复消费&#xff0c;可从消费者端和生产者端分别采取不同策略&#xff0c;下面为你详细介绍&#xff1a; 消费者端实现幂等消费 幂等消费是指对同一条消息&#xff0c;无论消费多少次&#xff0c;产生的业务结果都是一样的。 业务层面…...

一个批量文件Dos2Unix程序(Microsoft Store,开源)

这个程序可以把整个目录的文本文件改成UNIX格式&#xff0c;源码是用C#写的。 目录 一、从Microsoft Store安装 二、从github获取源码 三、功能介绍 3.1 运行 3.2 浏览 3.3 转换 3.4 转换&#xff08;无列表&#xff09; 3.5 取消 3.6 帮助 四、源码解读 五、讨论和…...

Python及Javascript的map 、 filter 、reduce类似函数的对比汇总

A. 在Python中&#xff0c;map 和 filter 是两个非常有用的内置函数&#xff0c;它们分别用于对可迭代对象中的每个元素执行某种操作&#xff0c;并返回结果。在JavaScript中&#xff0c;虽然没有内置的 map 和 filter 函数&#xff0c;但是可以使用数组的 map() 和 filter() …...

Linux中OS的管理和进程的概念

一、OS的管理 1.1操作系统宏观的理解 OS的本质是一款进行资源管理的软件 图示&#xff1a; 1.2OS存在的意义 1.2.1计算机的分层式管理结构 最底层的硬件部分遵循“冯诺依曼体系” &#xff0c;每一种硬件都在驱动层中有着自己对应的“驱动程序” 在OS中&#xff0c;驱动管…...

Spring定时任务修仙指南:从@Scheduled到分布式调度的终极奥义

各位被Thread.sleep()和while(true)折磨的Spring道友们&#xff01;今天要解锁的是Spring生态自带的定时任务三件套——Scheduled、TaskScheduler、Async定时组合技&#xff01;无需引入外部依赖&#xff0c;轻松实现从简单定时到分布式调度的全场景覆盖&#xff01;准备好抛弃…...

Node.js多版本共存管理工具NVM(最新版本)详细使用教程(附安装包教程)

目录 前言 一、Nvm下载 二、Nvm安装 三、配置nodeJS 前言 NVM&#xff08;Node Version Manager&#xff09;是一个用于管理多个Node.js版本的工具&#xff0c;主要帮助开发者在同一设备上轻松安装、切换和卸载不同版本的Node.js&#xff0c;解决项目间版本冲突问题。 一、…...

管道魔法木马利用Windows零日漏洞部署勒索软件

微软披露&#xff0c;一个现已修复的影响Windows通用日志文件系统&#xff08;CLFS&#xff09;的安全漏洞曾被作为零日漏洞用于针对少数目标的勒索软件攻击中。 01 攻击目标与漏洞详情 这家科技巨头表示&#xff1a;"受害者包括美国信息技术&#xff08;IT&#xff09…...

Devops之Argo:Argo 是什么,和现在常用的Jenkins之间的区别

Argo CD&#xff08;Argo Continuous Delivery 的缩写&#xff09;是一款基于 GitOps 的声明式 Kubernetes 持续交付工具。它提供了一种以 Git 为中心的方法来管理和部署应用程序到 Kubernetes 集群。Argo CD 遵循 GitOps 的原则&#xff0c;即将应用程序的预期状态存储在 Git …...

从 60 FPS 掉帧到 7.6 倍提速Rust + WebAssembly 优化《生命游戏》的实战指南

一、构建 FPS 统计器&#xff1a;用 performance.now() 实时观察性能变化 要优化&#xff0c;就要先 测量。我们在 JavaScript 端添加一个 fps 对象&#xff0c;结合 performance.now() 来监控每一帧的耗时&#xff0c;并统计最近 100 帧的平均 FPS、最小 FPS、最大 FPS&#…...

jmeter 集成ZAP进行接口测试中的安全扫描 实现方案

以下是将 JMeter 集成 ZAP(OWASP Zed Attack Proxy)进行接口测试中安全扫描的实现方案: 1. 环境准备 JMeter 安装:从 JMeter 官方网站(https://jmeter.apache.org/download_jmeter.cgi)下载并安装 JMeter,确保其版本稳定。ZAP 安装:从 ZAP 官方网站(https://www.zapr…...

Hyperlane 文件分块上传服务端

Hyperlane 文件分块上传服务端&#xff1a;高效、可靠、易用的文件上传解决方案 引言 在现代 Web 开发中&#xff0c;文件上传是许多应用的核心功能之一。然而&#xff0c;随着文件大小的增加和网络环境的复杂性&#xff0c;传统的单次文件上传方式已经难以满足需求。Hyperla…...

BT面板docker搭建excalidraw遇到的问题

1.傻瓜式拉取镜像 2.点击创建容器 3.暴露端口 4.放行端口和服务器安全组&#xff0c;如果用的是轻量型服务器&#xff0c;那就关闭防火墙 下面放图...

Qt之OpenGL使用Qt封装好的着色器和编译器

代码 #include "sunopengl.h"sunOpengl::sunOpengl(QWidget *parent) {}unsigned int VBO,VAO; float vertices[]{0.5f,0.5f,0.0f,0.5f,-0.5f,0.0f,-0.5f,-0.5f,0.0f,-0.5f,0.5f,0.0f };unsigned int indices[]{0,1,3,1,2,3, }; unsigned int EBO; sunOpengl::~sunO…...

【仿Mudou库one thread per loop式并发服务器实现】项目介绍+前置技术知识点

HTTP协议模块实现 1. 项目实现的目标2. 项目储备知识2.1 HTTP服务器2.2 Reactor模型 3. 功能模块划分3.1 SERVER模块3.1.1 Buffer模块3.1.2 Socket模块3.1.3 Channel模块3.1.4 Poller模块3.1.5 EventLoop模块3.1.6 Connection模块3.1.7 7. Acceptor模块3.1.8 TimerQueue模块3.1…...

Open Interpreter:重新定义人机交互的开源革命

引言 在人工智能技术蓬勃发展的今天&#xff0c;人机交互的方式正经历着前所未有的变革。Open Interpreter&#xff0c;作为一个开源项目&#xff0c;正在重新定义我们与计算机的互动方式。它允许大型语言模型&#xff08;LLMs&#xff09;在本地运行代码&#xff0c;通过自然…...

Shell编程之条件语句

目录 一.条件测试操作 1.文件测试 2.整数值比较 3.字符串比较 4.逻辑测试 二&#xff1a;if条件语句 1.if语句的结构 &#xff08;1&#xff09;单分支if语句 &#xff08;2&#xff09;双分支if语句 &#xff08;3&#xff09;多分支if语句 2.if语句应用示例 &…...

Python编程快速上手 让繁琐工作自动化笔记

编程基础 字符串使用单引号...

高性能文件上传服务

高性能文件上传服务 —— 您业务升级的不二选择 在当今互联网数据量激增、文件体积日益庞大的背景下&#xff0c;高效、稳定的文件上传方案显得尤为重要。我们的文件分块上传服务端采用业界领先的 Rust HTTP 框架 Hyperlane 开发&#xff0c;凭借其轻量级、低延时和高并发的特…...

【从零开始学习JVM | 第二篇】HotSpot虚拟机对象探秘

对象的创建 1.类加载检查 虚拟机遇到一条new的指令&#xff0c;首先去检查这个指令的参数能否在常量池中定位到这个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有&#xff0c;那必须先执行类的加载过程。 2.分配内存 在类…...

浅谈前端开发中的 npm、cnpm、pnpm、yarn各自特点

在前端开发中的 npm、cnpm、pnpm、yarn 等工具都是包管理器&#xff08;Package Manager&#xff09;&#xff0c;用于安装/更新/卸载 JavaScript 项目的依赖。 下面我详细地给你梳理下这些包管理器的作用、特点和适用场景&#x1f447; 一. npm&#xff08;Node Package Mana…...

【数据结构】包装类和泛型

目录 1.包装类 1.1 基本数据类型和对应的包装类 1.2 装箱和拆箱 1.3 自动装箱和自动拆箱 2.泛型 2.1泛型的概念 2.2引出泛型 3.语法 4.泛型类的使用 5.泛型的上界 1.包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基…...

红帽9运行容器一

运行容器&#xff1a;容器概念&#xff0c;构建&#xff0c;存储和运行容器的核心技术&#xff08;用户资源管理的控制组&#xff0c;进程隔离的命名空间&#xff0c;加强安全边界的SELinux和Seccomp&#xff09; 软件运行需要环境&#xff0c;系统库&#xff0c;配置文件和服…...

使用poi+itextpdf把word转成pdf

使用 Apache POI 和 iTextPDF 将 Word 转换为 PDF 需要分两步操作&#xff1a;先用 POI 读取 Word 内容&#xff0c;再用 iText 生成 PDF。 apache poi官方文档:Apache POI™ - Javadocs 以下是详细的代码实现示例&#xff1a; 环境准备 在 pom.xml 中添加依赖&#xff1a; …...

民安智库:开启零售行业客户满意度提升新征程​

在当今这个瞬息万变的商业世界中&#xff0c;零售市场的竞争愈发激烈&#xff0c;犹如一场没有硝烟的战争。各大零售企业为了抢占市场份额&#xff0c;纷纷使出浑身解数&#xff0c;从商品种类的丰富到店铺环境的优化&#xff0c;从价格策略的调整到服务质量的提升&#xff0c;…...

自行搭建一个Git仓库托管平台

1.安装Git sudo apt install git 2.Git本地仓库创建&#xff08;自己选择一个文件夹&#xff09; git init 这里我在 /home/test 下面初始化了代码仓库 1. 首先在仓库中新建一个txt文件&#xff0c;并输入一些内容 2. 将文件添加到仓库 git add test.txt 执行之后没有任何输…...

无锡无人机超视距驾驶证怎么考?

无锡无人机超视距驾驶证怎么考&#xff1f;在近年来&#xff0c;无人机技术的迅猛发展使得无人机的应用场景变得愈发广泛&#xff0c;其不仅在环境监测、农业喷洒、快递配送等领域展现出真金白银的价值&#xff0c;同时也推动了无人机驾驶证的需求。尤其是在无锡&#xff0c;随…...

pyautogui是什么:自动化鼠标和键盘操作

pyautogui是什么:自动化鼠标和键盘操作 目录 pyautogui是什么:自动化鼠标和键盘操作安装方法主要功能及使用示例1. 鼠标操作2. 键盘操作3. 获取屏幕信息应用场景注意事项pyautogui 是一个用于自动化鼠标和键盘操作的 Python 第三方库,它允许开发者通过编写 Python 代码来模拟…...

小白学习java第12天:IO流之缓冲流

1.IO缓冲流&#xff1a; 之前我们学习的都是原始流&#xff08;FileInputStream字节输入流、FileOutputStream字节输出流、FIleReader字符输入流、FIleWriter字符输出流&#xff09;其实我们可以知道对于这些其实性能都不是很好&#xff0c;要么太慢一个一个&#xff0c;要么就…...

智能导诊系统方案:人体画像导诊实现从症状到科室推荐及院内导航链路拆解(python示范 TensorFlow Embedding 层源码)

本文面向医院信息科负责人、医疗AI开发者、医院管理者&#xff0c;解决传统分诊依赖人工经验&#xff0c;效率低且易出错&#xff1b;患者跨科室就诊路径不清晰等痛点问题&#xff0c;实现症状到科室的精准推荐及动态导航链路优化。 如需获取智慧医院导航导诊系统解决方案请前往…...

声学测温度原理解释

已知声速&#xff0c;就可以得到温度。 不同温度下的胜诉不同。 25度的声速大约346m/s 绝对温度-273度 不同温度下的声速。 FPGA 通过测距雷达测温度&#xff0c;固定测量距离&#xff0c;或者可以测出当前距离。已知距离&#xff0c;然后雷达发出声波到接收到回波的时间&a…...

30天学Java第九天——线程

并行与并发的区别 并行是多核 CPU 上的多任务处理&#xff0c;多个任务在同一时间真正的同时执行并发是单核 CPU 上的多任务处理&#xff0c;多个任务在同一时间段内交替执行&#xff0c;通过时间片轮转实现交替执行&#xff0c;用于解决 IO 密集型任务的瓶颈 线程的创建方式…...

SaaS微服务架构的智慧工地源码,基于Spring Cloud +UniApp +MySql开发

基于微服务架构JavaSpring Cloud UniApp MySql技术开发&#xff0c;saas模式的一套智慧工地云平台源码&#xff0c;支持多端展示&#xff1a;PC端、大屏端、手机端、平板端。包含项目人员管理、视频监控管理、危大工程监管、绿色施工管理、现场物料管理、安全隐患排查等功能。 …...

Qt学习笔记——TableWidget的一些学习东西

TableWidget的一些学习东西 使用QtDesigner绘制表格&#xff0c;但是表格出现很多问题&#xff0c;烦死了&#xff0c;整理了一些内容。 在使用 Qt Designer 设置 QTableWidget 时&#xff0c;涉及大量属性选项&#xff0c;尤其是在初学阶段常常因为属性设置不当而导致表格显…...

《Uniapp-Vue 3-TS 实战开发》Pinia 及 Pinia 持久化

前言: 正文: 一、Pinia 基础用法 1. 安装与初始化 bash npm install pinia # 或 yarn add pinia 在 main.js/ts 中初始化: import { createApp } from vue import { createPinia } from pinia import App from ./App.vue const app = createApp(App) app.use(createPinia()…...

JAVA:SpringBoot 实现图片防盗链的技术指南

1、简述 防盗链(Hotlink Protection)是一种保护网站资源不被其他网站直接引用的技术,特别是在图片、视频等静态资源方面。防盗链的核心思想是检查请求的来源(Referer),只允许来自指定域名的请求访问资源。 在 Spring Boot 中,我们可以通过拦截器(Interceptor)或过滤…...

量子指纹识别

场景设定 某金融机构部署量子指纹认证系统&#xff0c;要求用户通过手机&#xff08;传感器A&#xff09;注册指纹&#xff0c;并在ATM机&#xff08;传感器B&#xff09;完成量子安全认证。系统需满足&#xff1a; 抗模板泄露&#xff1a;即使数据库被攻破&#xff0c;攻击者…...

图像变换方式区别对比(Opencv)

1. 变换示例 import cv2 import matplotlib.pyplot as plotimg cv2.imread(url) img_cut img[100:200, 200:300] img_rsize cv2.resize(img, (50, 50)) (hight,width) img.shape[:2] rotate_matrix cv2.getRotationMatrix2D((hight//2, width//2), 50, 1) img_wa cv2.wa…...