深入解析Spring Boot自动装配:原理、设计与最佳实践
引言
Spring Boot作为现代Java开发中的一股清流,凭借其简洁、快速和高效的特性,迅速赢得了广大开发者的青睐。而在Spring Boot的众多特性中,自动装载(Auto-configuration)无疑是最为耀眼的明珠之一。本文将深入剖析Spring Boot自动装载的核心原理,带你领略其背后的精妙设计。
一、Spring Boot Starter简介
在深入探讨自动装载之前,我们有必要先了解一下Spring Boot Starter的概念。Spring Boot Starter是一组“一站式服务”的依赖Jar包,它包含了Spring以及相关技术(如Redis、MySQL等)的所有依赖,并提供了自动配置的功能。简单来说,只需将所需的Starter引入项目中,Spring Boot就会自动为我们配置相关的依赖和配置,极大地简化了开发流程。
二、自动装载原理剖析
2.1 核心组件
Spring Boot的自动装载主要依赖于以下几个核心组件:
- @SpringBootApplication:这是一个复合注解,它包含了@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan注解。其中,@EnableAutoConfiguration注解是自动装载的关键所在。
- @EnableAutoConfiguration:该注解通过导入AutoConfigurationImportSelector类,实现了自动配置的导入功能。AutoConfigurationImportSelector类会根据项目中的依赖关系,自动选择并导入相应的自动配置类。
- @Conditional:这是一组条件注解,用于在自动配置类中进行条件判断。只有当满足特定条件时,相应的自动配置才会生效。这极大地提高了自动配置的灵活性和可定制性。
Spring Boot通过条件化装配实现智能配置,常用注解包括:
注解 生效条件 @ConditionalOnClass
类路径存在指定类 @ConditionalOnMissingBean
容器中无指定Bean @ConditionalOnProperty
配置文件中存在指定属性 @ConditionalOnWebApplication
当前为Web应用
2.2 自动配置流程
Spring Boot的自动配置流程大致可以分为以下几个步骤:
- 扫描项目依赖:Spring Boot会通过Maven或Gradle等构建工具扫描项目中的依赖关系,确定需要自动配置的组件。
- 匹配自动配置类:根据扫描到的依赖关系,Spring Boot会在META-INF/spring.factories文件中查找并匹配相应的自动配置类。
- 条件判断:在匹配到的自动配置类中,Spring Boot会使用@Conditional注解进行条件判断。只有当满足特定条件时(如存在某个类、某个属性被设置等),相应的自动配置才会生效。
- 自动配置:在满足条件的基础上,Spring Boot会自动配置相应的组件(如数据源、事务管理器等),并将其注册到Spring容器中。
2.3 自动配置的实现细节
- spring.factories文件:这是Spring Boot自动配置的核心配置文件。在该文件中,通过键值对的形式定义了自动配置类与条件注解的对应关系。当Spring Boot启动时,会自动读取该文件并加载相应的自动配置类。
- @ConditionalOn*注解:这是一组用于条件判断的注解,如@ConditionalOnBean、@ConditionalOnClass、@ConditionalOnProperty等。它们允许开发者在自动配置类中进行细粒度的条件判断,从而确保只有满足特定条件时才会进行自动配置。
- 自动配置类:自动配置类通常是一个被@Configuration注解标注的Java类,其中包含了需要自动配置的组件的定义和配置。这些组件可能是数据源、事务管理器、消息队列等。
三、自定义自动配置
虽然Spring Boot提供了大量的自动配置类来满足常见的开发需求,但在某些情况下,我们可能需要自定义自动配置。这时,可以通过以下步骤来实现:
- 创建自定义的自动配置类:使用@Configuration注解标注一个Java类,并在其中定义需要自动配置的组件。
- 使用@Conditional注解进行条件判断:在自定义的自动配置类中使用@Conditional注解进行条件判断,以确保只有在满足特定条件时才会进行自动配置。
- 在spring.factories文件中注册自定义的自动配置类:在项目的resources目录下创建META-INF文件夹,并在其中创建spring.factories文件。在该文件中,通过键值对的形式将自定义的自动配置类注册到Spring Boot的自动配置体系中。
四、自定义自动配置实战:构建企业级日志监控Starter
4.1 场景需求
假设需要为分布式系统开发统一日志监控组件,要求:
- 自动收集各节点日志
- 支持HTTP/RPC两种传输模式
- 与Spring Boot Actuator健康检查集成
- 可通过配置灵活切换模式
4.2 完整实现步骤
步骤1:创建自定义Starter项目结构
log-monitor-starter
├─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─company
│ │ └─logmonitor
│ │ ├─autoconfigure
│ │ │ LogMonitorAutoConfiguration.java
│ │ │ LogMonitorHealthIndicator.java
│ │ ├─config
│ │ │ LogMonitorProperties.java
│ │ └─transport
│ │ HttpTransportClient.java
│ │ RpcTransportClient.java
│ └─resources
│ └─META-INF
│ spring.factories
│ additional-spring-configuration-metadata.json
步骤2:定义配置属性类
@ConfigurationProperties(prefix = "company.log-monitor")
public class LogMonitorProperties {private TransportMode mode = TransportMode.HTTP;private String endpoint = "http://log-collector:8080";private int batchSize = 100;private Duration flushInterval = Duration.ofSeconds(30);// 枚举定义public enum TransportMode { HTTP, RPC }// getters/setters// Lombok @Data 注解可简化
}
步骤3:核心自动配置类
@Configuration
@EnableConfigurationProperties(LogMonitorProperties.class)
@ConditionalOnProperty(prefix = "company.log-monitor", name = "enabled", havingValue = "true", matchIfMissing = true)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class LogMonitorAutoConfiguration {@Bean@ConditionalOnMissingBean@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)public TransportClient httpTransportClient(LogMonitorProperties properties) {return new HttpTransportClient(properties);}@Bean@ConditionalOnMissingBean@ConditionalOnClass(name = "com.company.rpc.RpcClient")public TransportClient rpcTransportClient(LogMonitorProperties properties) {return new RpcTransportClient(properties);}@Bean@ConditionalOnMissingBeanpublic LogCollector logCollector(TransportClient transportClient, LogMonitorProperties properties,ObjectProvider<LogFilter> logFilters) {LogCollector collector = new LogCollector(transportClient, properties);logFilters.orderedStream().forEach(collector::addFilter);return collector;}@Bean@ConditionalOnEnabledHealthIndicator("logmonitor")public LogMonitorHealthIndicator logMonitorHealthIndicator(LogCollector collector) {return new LogMonitorHealthIndicator(collector);}
}
步骤4:条件化Bean注册
@Configuration
@ConditionalOnClass(LogstashEncoder.class)
class LogstashAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic LogFilter logstashFilter() {return new LogstashFilter();}
}@Configuration
@ConditionalOnProperty(prefix = "company.log-monitor.encryption", name = "enabled")
class EncryptionAutoConfiguration {@Beanpublic LogFilter encryptionFilter(LogMonitorProperties properties) {return new AesEncryptionFilter(properties.getEncryptionKey());}
}
步骤5:注册自动配置(spring.factories)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.company.logmonitor.autoconfigure.LogMonitorAutoConfiguration,\com.company.logmonitor.autoconfigure.LogstashAutoConfiguration,\com.company.logmonitor.autoconfigure.EncryptionAutoConfiguration
步骤6:配置元数据(IDE智能支持)
// additional-spring-configuration-metadata.json
{"properties": [{"name": "company.log-monitor.mode","type": "com.company.logmonitor.config.LogMonitorProperties$TransportMode","description": "日志传输模式选择,支持HTTP和RPC两种模式","defaultValue": "HTTP"},{"name": "company.log-monitor.encryption.enabled","type": "java.lang.Boolean","description": "是否启用日志加密传输","defaultValue": false}]
}
4.3 高级配置技巧
技巧1:环境感知配置
@Bean
@ConditionalOnCloudPlatform(CloudPlatform.KUBERNETES)
public LogFilter k8sMetadataFilter() {return new KubernetesMetadataFilter();
}@Bean
@Profile("prod")
public LogFilter productionFilter() {return new ProductionEnvironmentFilter();
}
技巧2:配置动态调整
@Bean
public ScheduledExecutorService logFlushScheduler(LogCollector collector, LogMonitorProperties properties) {return Executors.newSingleThreadScheduledExecutor(r -> new Thread(r, "log-flush-thread")).scheduleAtFixedRate(collector::flush,properties.getFlushInterval().toMillis(),properties.getFlushInterval().toMillis(),TimeUnit.MILLISECONDS);
}
技巧3:自动装配冲突解决
@Bean
@ConditionalOnMissingBean
@Conditional(TransportModeCondition.class)
public TransportClient transportClient(LogMonitorProperties properties) {// 根据配置模式创建对应客户端
}private static class TransportModeCondition extends AnyNestedCondition {TransportModeCondition() {super(ConfigurationPhase.PARSE_CONFIGURATION);}@ConditionalOnProperty(prefix = "company.log-monitor", name = "mode", havingValue = "HTTP")static class HttpMode {}@ConditionalOnProperty(prefix = "company.log-monitor", name = "mode", havingValue = "RPC")static class RpcMode {}
}
配置覆盖测试
# application-test.properties
company.log-monitor.mode=RPC
company.log-monitor.endpoint=rpc://log-server:9090
4.4 生产级最佳实践
1.版本兼容性:
<!-- 在starter的pom.xml中声明 -->
<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
2.配置加密支持:
@Bean
@ConditionalOnMissingBean
public LogFilter encryptionFilter(LogMonitorProperties properties,@Value("${company.log-monitor.encryption.key}") String encryptedKey,Environment environment) {String decryptedKey = decrypt(encryptedKey, environment);return new AesEncryptionFilter(decryptedKey);
}
通过以上完整示例,可以实现:
- 环境自适应的日志收集方案
- 可插拔的传输协议支持
- 生产级监控指标暴露
- 安全加密传输能力
- 多环境配置管理
总结:
Spring Boot的自动装载机制是其成功的关键之一。通过简洁的依赖管理和灵活的自动配置,Spring Boot极大地简化了开发流程,提高了开发效率。本文深入剖析了Spring Boot自动装载的核心原理和实现细节,并介绍了如何自定义自动配置。希望这些内容能够帮助你更好地理解和应用Spring Boot的自动装载机制。
相关文章:
深入解析Spring Boot自动装配:原理、设计与最佳实践
引言 Spring Boot作为现代Java开发中的一股清流,凭借其简洁、快速和高效的特性,迅速赢得了广大开发者的青睐。而在Spring Boot的众多特性中,自动装载(Auto-configuration)无疑是最为耀眼的明珠之一。本文将深入剖析Sp…...
【责任链】模式解决流程中多个接口的流程问题
业务需求 整体流程有5步骤,每个步骤调用一个接口,每个接口成功才能进行下一步。如a->b->c->d->e, 比如入学报到 a:报班,根据名字生成学号uid b:根据学号分配班级获取班级编号cid c:…...
excel常见错误包括(#N/A、#VALUE!、#REF!、#DIV/0!、#NUM!、#NAME?、#NULL! )
目录 1. #N/A2. #VALUE!3. #REF!4. #DIV/0!5. #NUM!6. #NAME?7. #NULL!8.图表总结 在 Excel 中,可能会遇到以下常见的错误值,每个都有特定的含义和成因: 1. #N/A 含义: 表示“Not Available”(不可用)。…...
【湖南大学】2025我们该如何看待DeepSeek
大家好,我是樱木。 DeepSeek 官方网站:https://www.deepseek.com/ 一、DeepSeek 到底是什么? TA 到底厉害在哪里? 故事从 ChatGPT 说起 去年我们看到 Open AI 发布ChatGPT 后,全球的注意力到了 AI 身上。 我们来拆…...
RAG中构建个人知识库
1. 添加本地模型 1.1 查看本地模型 ollama list1.2 ragflow添加本地模型 1.3 系统模型配置 2. 构建知识库 2.1 准备知识库素材 2.2 配置知识库 2.3 知识库绑定素材文件 上传文件素材 - 解析文件 3. 构建交互系统 3.1 配置助理 3.2 完善提示词 3.3 设置模型参数 4. 体验效…...
在 Kubernetes (k8s) 中,apiserver 的 IIP和 VIP的区别
在 Kubernetes (k8s) 中,apiserver 的 IIP(Internal IP) 和 VIP(Virtual IP) 是与集群网络通信和高可用性设计相关的两个重要概念。 IIP(Internal IP) 定义: IIP 是 apiserver 所在…...
OpenCV--图像形态学
在图像处理领域,图像形态学是一种基于形状进行图像分析的有力工具,广泛应用于图像分割、特征提取、边缘检测、图像降噪等多个方面。借助 OpenCV 这个强大的计算机视觉库,我们可以轻松实现各种图像形态学操作。本文将深入探讨图像形态学的基本…...
智慧医疗数据集
WiNGPT2 更新时间:2024-11-29 访问地址: GitHub 描述: WiNGPT是一个基于GPT的医疗垂直领域大模型,旨在将专业的医学知识、医疗信息、数据融会贯通,为医疗行业提供智能化的医疗问答、诊断支持和医学知识等信息服务,…...
3D激光轮廓仪知识整理(待补充)
文章目录 1.原理和应用场景1.1 相机原理1.1.1 测量原理1.1.2 相机激光器1.1.3 沙姆镜头1.1.4 相机标定1.1.5 中心线提取 1.2 应用场景1.2.1 测量相关应用1.2.2 缺陷检测相关易用 2.相机参数介绍及选型介绍2.1 成像原理2.2 原始图成像2.3 生成轮廓图2.4 相机规格参数2.4.1 单轮廓…...
算法思想之双指针
文章目录 双指针字符串序列判定字符串所有整数最小和服务交换接口失败率分析分披萨最多团队 双指针 双指针是指在解决问题时使用两个指针,通常分别指向数组或字符串中的不同位置,通过移动这两个指针来解决问题的一种技巧。双指针技巧常用于解决数组、链…...
Windows环境下PyCharm 配置miniforge
问题描述. 目前Anconda python 环境管理软件,已非常臃肿。为了替代该软件,可以使用miniforge软件来代替。 1. 安装windows miniforge软件 (1) 下载网站:https://github.com/conda-forge/miniforge?tabreadme-ov-file 从网址下载ÿ…...
C语言基础18
内容提要 构造类型 结构体 共用体/联合体 枚举 typedef 构造类型 数据类型 基本类型/基础类型 整型 短整型:short [int] -- 2字节 基本整型:int -- 4字节 长整型:long [int] -- 32位4字节/64位8字节 长长整型:long long…...
Docker部署Jenkins服务
文章目录 1.下载Jenkins服务2.部署Java21(可选)2.1 安装Java21 3.Maven3.9.9安装4.启动Jenkins5.初始化Jenkins5.1 入门5.2 安装推荐的插件5.3 创建第一个管理员用户5.4 实例配置5.5 Jenkins已就绪5.6 开始使用Jenkins5.7 重启Jenkins 6.配置Jenkins6.1 …...
【题解-Acwing】798. 差分矩阵
题目:798. 差分矩阵 题目描述 输入一个n行m列的整数矩阵,再输入q个操作,每个操作包含五个整数 x1,y1,x2,y2,c,其中 (x1,y1)和 (x2,y2)表示一个子矩阵的左上角坐标和右下角坐标。 每个操作都要将选中的子矩阵中的每个元素的值加…...
linux环境下的硬盘分区格式化工具介绍 fdisk,gdisk,parted,cfdisk,cgdisk,sfdisk,gparted 笔记250407
linux环境下的硬盘分区格式化工具介绍 fdisk,gdisk,parted,cfdisk,cgdisk,sfdisk,gparted 笔记250407 以下是 Linux 系统中常用的 硬盘分区与格式化工具,涵盖命令行和图形界面工具,按功能分类整理: 一、分区管理工具 1. 命令行工具 工具功能…...
Ubuntu 24.04 LTS系统安装RTX 4090显卡驱动和cuda并部署ollama下载DeepSeek模型【自用详细版】
自己捣鼓玩玩哈,正好有机子 1. 安装驱动前的系统配置工作 卸载原有驱动并禁用nouveau sudo apt remove --purge nvidia*sudo cp /etc/modprobe.d/blacklist.conf /etc/modprobe.d/blacklist.conf.backup //备份文件sudo vim /etc/modprobe.d/blacklist.conf //修…...
FogFL: Fog-Assisted Federated Learning for Resource-Constrained IoT Devices
摘要 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 -在本文中,我们提出了一个支持雾的联邦学习框架–FogFL–来促进资源受限的物联网环境中延迟敏感应用的分布式学习。联邦学习(FL)是一种流行的分…...
音视频入门基础:RTCP专题(2)——RTCP协议简介(上)
一、引言 本文对RTCP协议进行简介。在简介之前,请各位先下载RTCP的官方文档《RFC 3550》。《RFC 3550》总共有89页。本文下面所说的“页数”是指在pdf阅读器中显示的页数: 二、RTCP协议简介 本段内容对应《RFC 3550》的第6节。根据《RFC 3550》第17页&…...
oklink js逆向(入口定位)
分析api请求,定位参数 X-Apikey 搜索关键字apikey,发现结果太多 结合搜索结果,搜索关键字 apikey(,只找到5个 断点后定位 可见使用了字符串混淆,所以搜索不到 x-apikey 还可以通过搜索 headers,追踪调用栈的…...
go原子操作和锁的区别是什么?
在Go语言中,原子操作和锁都是用于实现并发编程的同步机制,但它们的工作方式和适用场景有所不同。下面是它们的主要区别: 1. 原子操作(Atomic Operations) 定义:原子操作是一种不可分割的操作,…...
QtConcurrent
以下是 QtConcurrent 的一些常见用法示例: QtConcurrent::run QtConcurrent::run 是最常用的函数,用于在单独的线程中运行一个函数。 运行普通函数 #include <QtConcurrent> #include <QDebug> #include <QThread>void myFunction…...
Git 仓库在内网与 Gitee 间迁移及同步记录
Git 仓库在内网与 Gitee 间迁移及同步记录 在软件开发过程中,常常会遇到需要将代码仓库进行迁移或同步的情况。近期我就碰到了要把 Gitee 代码仓库移植到内网代码仓库,并且后续还得进行同步的需求。这里把整个过程记录下来,方便以后自己参考…...
如何保证mysql和redis的数据一致性
保证 MySQL 和 Redis 的数据一致性是分布式系统中常见的挑战,因为 Redis 作为缓存层,可能存在与底层数据库数据不一致的情况。以下是几种常用的方案及其优缺点对比: 1. 缓存更新策略 (1) Cache-Aside Pattern(旁路缓存模式&#…...
Java学习——day23(反射的对象创建与方法调用)
文章目录 1. 使用反射实例化对象1.1 利用无参构造函数创建对象1.2利用带参构造函数创建对象 2.通过反射调用对象方法2.1 调用公共方法2.2 调用私有方法(需设置访问权限)3. 访问和修改对象的属性3.1 公共属性3.2 私有属性 4. 实践任务4.1工厂类 SimpleFac…...
遇到无法连接香港服务器可能是什么原因导致的呢
遇到无法连接香港服务器的情况时,别急着重启或联系客服,先搞清楚到底是哪里断了链条。问题可能出在服务器本身,也可能是你的本地网络、路由路径、DNS、甚至运营商的“干预”。以下是常见的几个可能原因,建议你可以逐一排查&#x…...
Python----计算机视觉处理(Opencv:道路检测完整版:透视变换,提取车道线,车道线拟合,车道线显示,)
Python----计算机视觉处理(Opencv:道路检测之道路透视变换) Python----计算机视觉处理(Opencv:道路检测之提取车道线) Python----计算机视觉处理(Opencv:道路检测之车道线拟合) Python----计算机视觉处理࿰…...
javaweb自用笔记:Maven分模块设计与开发、Maven继承与聚合、Maven私服
Maven分模块设计与开发 Maven继承与聚合 继承 版本锁定 dependencies引入依赖,dependencyManagement不代表依赖被引入,如果要使用dependencyManagement下的依赖,还需要在dependencies里面定义 聚合 如果没有用聚合,将这个项目打…...
在PyCharm中出现 **全角字符与非英文符号混合输入** 的问题
在PyCharm中出现 全角字符与非英文符号混合输入 的问题(如 124345dfs$¥cvd)࿰…...
数字身份DID协议:如何用Solidity编写去中心化身份合约
本文提出基于以太坊的自主主权身份(SSI)实现方案,通过扩展ERC-734/ERC-735标准构建链上身份核心合约,支持可验证声明、多密钥轮换、属性隐私保护等特性。设计的三层架构体系将身份控制逻辑与数据存储分离,在测试网环境…...
Linux的RPM包管理详解
Linux的RPM包管理详解 引言 RPM(Red Hat Package Manager)是Linux系统中一种重要的软件包管理工具,它以“.rpm”为扩展名,广泛应用于基于Red Hat的Linux发行版,如CentOS、Fedora、openSUSE等。RPM包不仅简化了软件包…...
其它理论原则
ABC理论 假设(Assumption)影响行为(Behavior),行为最终影响结果(Consequence)。 如果产品经理认为同事是一个不讲道理的人,那么产品经理在和他交流时就会产生抵触的行为,…...
C++中的类和对象(上)
1 类的定义 1.1 类定义的格式 1 class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省 略》。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数…...
LLaMA-Factory 数据集成从入门到精通
一、框架概述 LLaMA-Factory 框架通过Alpaca/Sharegpt双格式体系实现多任务适配,其中Alpaca专注结构化指令微调(含SFT/DPO/预训练),Sharegpt支持多角色对话及多模态数据集成。核心配置依托 dataset_info.json 实现数据源映射、格…...
高级:JVM面试题深度剖析
一、引言 在Java技术面试中,JVM(Java虚拟机)相关知识是考察重点之一。深入理解JVM的内存模型、垃圾回收机制、类加载机制等,不仅能帮助开发者优化Java应用性能,还能在面试中展现深厚的技术功底。本文将针对这些高频知…...
Spring MVC 中 @ResponseBody 注解深度使用教程
一、注解核心作用 ResponseBody 是 Spring MVC 中处理 响应体内容 的核心注解,主要功能: 跳过视图解析器:直接返回数据而非视图名称自动数据转换:根据返回值类型自动转换响应格式(JSON/XML/纯文本)RESTfu…...
数据结构第一轮复习--第七章查找(包含课程代码)
基于数组实现顺序查找代码 //顺序查找的实现 typedef struct{ //查找表的数据结构(顺序表) ElemType *elem; //指向开辟的动态数组基址 (起始地址) int TableLen; //表的长度 }SSTable; //顺序查找 int Search_Seq(SSTable ST…...
Springboot JPA 集成ShardingSphere
Spring Boot集成JPA与ShardingSphere可通过以下步骤实现分库分表功能,需重点关注依赖配置、分片规则定义及JPA适配问题: 一、依赖配置 1. 引入核心依赖 在pom.xml中添加ShardingSphere和JPA相关依赖: <!-- ShardingSphere JDBC --&…...
详细介绍javaspringboot操控redis的高级特性1. 事务支持2. 发布/订阅3. Pipeline批量操作
Spring Boot 对 Redis 的操作提供了丰富的高级特性,以下是对事务支持、发布 / 订阅、Pipeline 批量操作的详细介绍: 事务支持 原理:Redis 事务是一个单独的隔离操作,它可以包含多个命令,这些命令要么全部执行&#x…...
第一次3D打印,一个简单的小方块(Rhino)
一、建模 打开犀牛,我们选择立方体 我们点击上册的中心点 输入0,然后回车0 而后我们输长度:10,回车确认 同样的,宽度10 高度同样是10 回车确认后,我们得到一个正方形 二、导出模型 我们选择文件—>保存…...
数据分享:汽车测评数据
说明:如需数据可以直接到文章最后关注获取。 1.数据背景 Car Evaluation汽车测评数据集是一个经典的机器学习数据集,最初由 Marko Bohanec 和 Blaz Zupan 创建,并在 1997 年发表于论文 "Classifier learning from examples: Common …...
硬盘分区格式之GPT(GUID Partition Table)笔记250406
硬盘分区格式之GPT(GUID Partition Table)笔记250406 GPT(GUID Partition Table)硬盘分区格式详解 GPT(GUID Partition Table)是替代传统 MBR 的现代分区方案,专为 UEFI(统一可扩展固…...
辉视智慧医院:以科技温度 重塑医疗未来新生态
大家是否想过,医院里的广播对讲系统也能变身‘智慧管家’?今天带您走进辉视智慧医院,看看他们如何用四大黑科技,让医患沟通更暖心、更高效! 一、物联网技术:医疗设备‘开口说话’,广播系统秒变‘…...
Google 发布 Sec-Gemini v1:用 AI 重塑网络安全防御格局?
在网络威胁日益复杂化、自动化程度不断提高的今天,防御方常常感到力不从心。为了扭转这一局面,Google 近日迈出了重要一步,宣布推出专为网络安全领域量身打造的实验性 AI 模型——Sec-Gemini v1。该模型由 Google 内部的 Sec-Gemini 团队成员…...
Android 使用ninja加速编译的方法
ninja的简介 随着Android版本的更迭,makefile体系逐渐增多,导致make单编模块的时间越来越长,每次都需要半个小时甚至更长时间,其原因为每次make都会重新加载所有mk文件,再生成ninja编译,此完整过程十分耗时…...
windterm终端软件使用
windterm终端软件使用 下载安装包:https://github.com/kingToolbox/WindTerm/releases ssh连接: 可以复用vscode连接ssh信息 onekey 相当于服务器主机的用户名和密码 点击配置标签如Linux,输入用户名如root, identity file指定本地公钥&a…...
《操作系统真象还原》第六章——完善内核
文章目录 [toc]前言调用约定和混合编程调用约定混合编程 实现打印函数print.S显卡的端口控制实现单个字符打印put_char定义数据类型put_char编码修改内核main.c验证put_char 实现字符串打印put_str 结语 前言 学完上一章后,我们已经完成了一个操作系统最基本的三个…...
上海餐饮市场数据分析与可视化
上海作为中国的经济中心和国际化大都市,其餐饮市场具有高度的多样性和竞争性。随着消费者需求的不断变化,餐饮行业的从业者和投资者需要深入了解市场现状和趋势,以便制定更有效的商业策略。本文将通过数据分析和可视化技术,深入探讨上海餐饮市场的现状和趋势,为餐饮从业者…...
不花钱也能玩GPT-4o,国内可用
家人们!最近GPT-4o生图功能真的离谱到不真实,各种吉卜力、宫崎骏、3D风格等刷爆小红书。 由于只有GPT官网,只有Plus用户才能用,很多小伙伴们都没有机会体验过GPT,本期就分享一个国内也能直接玩的方法。 第一步&#x…...
ResNet改进(22):提升特征选择能力的卷积神经网络SKNet
在计算机视觉领域,残差网络(ResNet)一直是图像分类任务中的经典架构。本文将介绍一种改进版的ResNet18,它融合了选择性核(SK)机制,能够自适应地调整不同感受野的特征权重,从而提升模型性能。下面我们将详细解析这个实现代码。 一、代码概述 这个Python脚本实现了一个带有S…...
实战代码:esp32-cam按钮控制手机拍照V1.0
#include <WiFi.h> #include <HTTPClient.h> // WiFi设置 const char* ssid “MIFI-020806-2.4G”; const char* password “12345678”; // 静态IP配置 IPAddress staticIP(192, 168, 1, 32); // 设置为固定IP IPAddress gateway(192, 168, 1, 1); // 网关地址…...