Spring Boot自动配置原理:如何实现零配置启动
引言
在现代软件开发中,Spring 框架已经成为 Java 开发领域不可或缺的一部分。而 Spring Boot 的出现,更是为 Spring 应用的开发带来了革命性的变化。Spring Boot 的核心优势之一就是它的“自动配置”能力,它极大地简化了 Spring 应用的配置过程,使得开发者可以专注于业务逻辑的实现,而无需花费大量时间在繁琐的配置文件上。本文将深入探讨 Spring Boot 自动配置的原理,分析它是如何实现“零配置启动”的,并通过实际代码示例帮助读者更好地理解和应用这一强大特性。
一、Spring Boot 自动配置的背景与意义
(一)传统 Spring 应用的配置痛点
在传统 Spring 应用开发中,开发者需要手动配置大量的 XML 文件或注解,以完成诸如 Bean 的定义、组件扫描、事务管理、数据源配置等任务。例如,一个简单的 Spring MVC 应用可能需要以下配置:
-
XML 配置文件:定义 Bean、数据源、事务管理器等。
-
注解配置:使用
@Configuration
、@Component
、@Service
等注解来声明组件。 -
环境配置:配置数据库连接信息、外部服务地址等。
这种配置方式不仅繁琐,而且容易出错,尤其是对于新手开发者来说,学习成本较高。此外,随着项目规模的扩大,配置文件的维护也变得越来越复杂。
(二)Spring Boot 的设计理念
Spring Boot 的核心设计理念是“约定大于配置”(Convention over Configuration)。它通过一系列默认的配置和自动配置机制,使得开发者只需要遵循 Spring Boot 的约定,即可快速启动和运行一个 Spring 应用,而无需手动编写大量的配置代码。这种设计理念不仅提高了开发效率,还降低了开发门槛,使得 Spring 框架更加易于上手和使用。
(三)自动配置的目标
Spring Boot 的自动配置目标是实现“零配置启动”,即开发者无需编写任何配置代码,只需引入相关的依赖,Spring Boot 就会自动完成所有必要的配置。例如,当开发者引入了 Spring Boot 的 Web 依赖后,Spring Boot 会自动配置一个嵌入式的 Tomcat 容器,并完成 Spring MVC 的初始化。
二、Spring Boot 自动配置的核心机制
(一)@SpringBootApplication
注解
@SpringBootApplication
是 Spring Boot 应用的核心注解,它是一个组合注解,包含了以下三个注解:
-
@SpringBootConfiguration
:标识当前类是一个 Spring Boot 配置类。 -
@EnableAutoConfiguration
:启用 Spring Boot 的自动配置机制。 -
@ComponentScan
:启用组件扫描,扫描当前包及其子包中的组件。
java复制
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, value = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, value = AutoConfigurationExcludeFilter.class) }
)
public @interface SpringBootApplication {
}
通过 @SpringBootApplication
注解,开发者只需要在主类上添加一个注解,即可启动 Spring Boot 的自动配置机制。
(二)@EnableAutoConfiguration
注解
@EnableAutoConfiguration
是自动配置的核心注解,它通过 @Import(AutoConfigurationImportSelector.class)
导入了一个特殊的类 AutoConfigurationImportSelector
。AutoConfigurationImportSelector
是一个 DeferredImportSelector
,它会在 Spring 容器启动时,根据项目中引入的依赖和类路径中的资源,动态地选择并导入一系列的自动配置类。
java复制
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}
(三)AutoConfigurationImportSelector
类
AutoConfigurationImportSelector
是自动配置的入口类,它通过以下步骤实现自动配置:
-
加载配置类列表:通过
SpringFactoriesLoader
加载META-INF/spring.factories
文件中定义的自动配置类。 -
过滤配置类:根据项目中引入的依赖和类路径中的资源,过滤掉不适用的配置类。
-
导入配置类:将过滤后的配置类导入到 Spring 容器中。
AutoConfigurationImportSelector
的核心方法是 getCandidateConfigurations
,它会加载并返回所有候选的自动配置类。
java复制
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. "+ "If you are using a custom packaging, make sure that file is correct.");return configurations;
}
(四)spring.factories
文件
spring.factories
文件是 Spring Boot 自动配置的关键。它位于 META-INF
目录下,是一个普通的文本文件,用于定义自动配置类的列表。例如,Spring Boot 的 Web 模块会在 spring.factories
文件中定义以下内容:
properties复制
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
当 Spring Boot 启动时,AutoConfigurationImportSelector
会加载 spring.factories
文件中定义的配置类,并根据条件过滤后导入到 Spring 容器中。
(五)条件注解
Spring Boot 的自动配置机制依赖于条件注解来实现动态配置。条件注解允许开发者根据特定的条件来决定是否加载某个配置类或 Bean。Spring Boot 提供了一系列内置的条件注解,例如:
-
@ConditionalOnClass
:当指定的类在类路径中时,条件成立。 -
@ConditionalOnMissingBean
:当容器中没有指定的 Bean 时,条件成立。 -
@ConditionalOnProperty
:当指定的属性存在且满足特定值时,条件成立。 -
@ConditionalOnWebApplication
:当应用是一个 Web 应用时,条件成立。
这些条件注解使得 Spring Boot 能够根据项目的实际情况动态地选择和加载配置类。例如,WebMvcAutoConfiguration
类上使用了 @ConditionalOnWebApplication
注解,只有当应用是一个 Web 应用时,才会加载该配置类。
java复制
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
}
三、Spring Boot 自动配置的实现过程
(一)启动流程
当 Spring Boot 应用启动时,@SpringBootApplication
注解会触发自动配置机制。以下是自动配置的启动流程:
-
加载
spring.factories
文件:AutoConfigurationImportSelector
通过SpringFactoriesLoader
加载META-INF/spring.factories
文件中定义的自动配置类。 -
过滤配置类:根据条件注解过滤掉不适用的配置类。
-
导入配置类:将过滤后的配置类导入到 Spring 容器中。
-
初始化 Bean:Spring 容器根据导入的配置类初始化相关的 Bean。
(二)自动配置类的加载
自动配置类的加载是通过 SpringFactoriesLoader
实现的。SpringFactoriesLoader
是 Spring 框架提供的一个工具类,用于加载 META-INF/spring.factories
文件中定义的类。以下是加载过程的代码示例:
java复制
public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {String factoryTypeName = factoryType.getName();return loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
}private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {MultiValueMap<String, String> result = Cache.value();if (result != null) {return result;}result = new LinkedMultiValueMap<>();try {Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));List<Properties> factoryFiles = new ArrayList<>();while (urls.hasMoreElements()) {URL url = urls.nextElement();UrlResource resource = new UrlResource(url);Properties properties = PropertiesLoaderUtils.loadProperties(resource);factoryFiles.add(properties);}for (Properties properties : factoryFiles) {properties.forEach((key, value) -> {String factoryClassName = asString(value);result.add(asString(key), factoryClassName);});}} catch (IOException ex) {throw new IllegalArgumentException("Unable to load factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);}Cache.cacheValue(result);return result;
}
(三)条件注解的过滤
条件注解的过滤是通过 ConditionEvaluator
实现的。ConditionEvaluator
是 Spring Boot 提供的一个工具类,用于评估条件注解是否成立。以下是条件注解的过滤过程:
-
解析条件注解:
ConditionEvaluator
解析配置类上的条件注解。 -
评估条件:根据条件注解的规则,评估条件是否成立。
-
过滤配置类:如果条件不成立,则过滤掉该配置类。
例如,@ConditionalOnClass
注解的评估逻辑如下:
java复制
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {ClassLoader classLoader = context.getClassLoader();if (classLoader == null) {return false;}String[] classes = metadata.getAllAnnotationAttributes(ConditionalOnClass.class.getName(), false).get("value").getArrayValue();for (String className : classes) {if (!ClassUtils.isPresent(className, classLoader)) {return false;}}return true;
}
(四)配置类的导入
过滤后的配置类会被导入到 Spring 容器中。Spring 容器会根据配置类中的定义初始化相关的 Bean。例如,WebMvcAutoConfiguration
类会初始化 Spring MVC 的相关 Bean,包括 DispatcherServlet
、RequestMappingHandlerMapping
等。
java复制
@Bean(name = DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
@ConditionalOnBean(DispatcherServlet.class)
@ConditionalOnMissingBean(name = DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME, value = DispatcherServlet.class)
public DispatcherServlet dispatcherServlet(DispatcherServlet dispatcherServlet) {return dispatcherServlet;
}
四、Spring Boot 自动配置的实践案例
(一)Web 应用的自动配置
当开发者引入了 Spring Boot 的 Web 依赖后,Spring Boot 会自动配置一个嵌入式的 Tomcat 容器,并完成 Spring MVC 的初始化。以下是 Web 应用的自动配置过程:
-
加载
spring.factories
文件:AutoConfigurationImportSelector
加载META-INF/spring.factories
文件中定义的自动配置类,包括WebMvcAutoConfiguration
、ServletWebServerFactoryAutoConfiguration
等。 -
过滤配置类:根据条件注解过滤掉不适用的配置类。例如,
@ConditionalOnWebApplication
注解会过滤掉非 Web 应用的配置类。 -
导入配置类:将过滤后的配置类导入到 Spring 容器中。
-
初始化 Bean:Spring 容器根据导入的配置类初始化相关的 Bean,包括
DispatcherServlet
、RequestMappingHandlerMapping
等。
(二)数据源的自动配置
当开发者引入了 Spring Boot 的数据源依赖后,Spring Boot 会自动配置一个数据源,并完成 JPA 或 MyBatis 的初始化。以下是数据源的自动配置过程:
-
加载
spring.factories
文件:AutoConfigurationImportSelector
加载META-INF/spring.factories
文件中定义的自动配置类,包括DataSourceAutoConfiguration
、JpaAutoConfiguration
等。 -
过滤配置类:根据条件注解过滤掉不适用的配置类。例如,
@ConditionalOnClass
注解会过滤掉没有引入相关依赖的配置类。 -
导入配置类:将过滤后的配置类导入到 Spring 容器中。
-
初始化 Bean:Spring 容器根据导入的配置类初始化相关的 Bean,包括
DataSource
、EntityManagerFactory
等。
(三)自定义自动配置
开发者可以通过创建自己的自动配置类来扩展 Spring Boot 的自动配置机制。以下是自定义自动配置的步骤:
-
创建自动配置类:创建一个带有
@Configuration
注解的类,并在类上添加条件注解。 -
定义 Bean:在自动配置类中定义相关的 Bean。
-
注册到
spring.factories
文件:将自定义的自动配置类添加到META-INF/spring.factories
文件中。
例如,创建一个自定义的自动配置类 MyAutoConfiguration
:
java复制
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(MyService.class)
public class MyAutoConfiguration {@Beanpublic MyService myService() {return new MyService();}
}
在 META-INF/spring.factories
文件中添加以下内容:
properties复制
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration
五、Spring Boot 自动配置的优势与局限性
(一)优势
-
简化配置:Spring Boot 的自动配置机制极大地简化了 Spring 应用的配置过程,开发者无需手动编写大量的配置代码。
-
提高效率:开发者可以专注于业务逻辑的实现,而无需花费大量时间在配置文件的维护上。
-
易于上手:Spring Boot 的自动配置机制使得 Spring 框架更加易于上手和使用,降低了开发门槛。
-
动态配置:通过条件注解,Spring Boot 能够根据项目的实际情况动态地选择和加载配置类,提高了配置的灵活性。
(二)局限性
-
配置覆盖:虽然 Spring Boot 提供了大量的默认配置,但在某些情况下,开发者可能需要手动覆盖默认配置。
-
复杂项目:对于一些复杂的项目,自动配置可能无法完全满足需求,开发者需要手动进行一些配置。
-
性能问题:自动配置机制会加载和评估大量的配置类,可能会影响应用的启动性能。
六、如何优化 Spring Boot 自动配置
(一)自定义配置
开发者可以通过创建自定义的配置类来覆盖 Spring Boot 的默认配置。例如,自定义数据源配置:
java复制
@Configuration
public class DataSourceConfig {@Beanpublic DataSource dataSource() {return new HikariDataSource();}
}
(二)禁用自动配置
开发者可以通过在 application.properties
文件中设置 spring.autoconfigure.exclude
属性来禁用某些自动配置类。例如:
properties复制
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
(三)优化启动性能
开发者可以通过以下方式优化 Spring Boot 的启动性能:
-
减少依赖:只引入项目中实际需要的依赖,避免引入不必要的依赖。
-
延迟加载:通过
@Lazy
注解延迟加载某些 Bean,减少启动时的初始化开销。 -
优化配置:通过自定义配置类优化自动配置的性能。
七、总结
Spring Boot 的自动配置机制是其核心特性之一,它通过一系列默认的配置和动态的条件注解,极大地简化了 Spring 应用的配置过程,实现了“零配置启动”。开发者只需引入相关的依赖,Spring Boot 就会自动完成所有必要的配置。通过本文的介绍,读者应该对 Spring Boot 自动配置的原理有了深入的理解,并能够通过实践案例更好地应用这一强大特性。
然而,Spring Boot 的自动配置机制也存在一些局限性。在某些情况下,开发者可能需要手动覆盖默认配置或禁用某些自动配置类。此外,自动配置机制可能会对应用的启动性能产生一定的影响。因此,开发者需要根据项目的实际情况,合理地使用和优化 Spring Boot 的自动配置机制,以充分发挥其优势。
总之,Spring Boot 的自动配置机制为 Spring 应用的开发带来了极大的便利,它不仅提高了开发效率,还降低了开发门槛。随着 Spring Boot 的不断发展和完善,我们有理由相信它将在未来的 Java 开发领域中发挥更加重要的作用。
相关文章:
Spring Boot自动配置原理:如何实现零配置启动
引言 在现代软件开发中,Spring 框架已经成为 Java 开发领域不可或缺的一部分。而 Spring Boot 的出现,更是为 Spring 应用的开发带来了革命性的变化。Spring Boot 的核心优势之一就是它的“自动配置”能力,它极大地简化了 Spring 应用的配置…...
React技术栈搭配(全栈)(MERN栈、PERN栈)
文章目录 1. MERN 栈2. PERN 栈3. React Next.js Node.js4. JAMstack (JavaScript, APIs, Markup)5. React GraphQL Node.js6. React Native Node.js结论 React作为前端框架已经成为了现代web开发的重要组成部分。在全栈开发中,React通常…...
Linux - 线程池
线程池 什么是池? 池化技术的核心就是"提前准备并重复利用资源". 减少资源创建和销毁的成本. 那么线程池就是提前准备好一些线程, 当有任务来临时, 就可以直接交给这些线程运行, 当线程完成这些任务后, 并不会被销毁, 而是继续等待任务. 那么这些线程在程序运行过程…...
以Python构建ONE FACE管理界面:从基础至进阶的实战探索
一、引言 1.1 研究背景与意义 在人工智能技术蓬勃发展的当下,面部识别技术凭借其独特优势,于安防、金融、智能终端等众多领域广泛应用。在安防领域,可助力监控系统精准识别潜在威胁人员,提升公共安全保障水平;金融行业中,实现刷脸支付、远程开户等便捷服务,优化用户体…...
使用Sum计算Loss和解决梯度累积(Gradient Accumulation)的Bug
使用Sum计算Loss和解决梯度累积的Bug 学习 https://unsloth.ai/blog/gradient:Bugs in LLM Training - Gradient Accumulation Fix 这篇文章的记录。 在深度学习训练过程中,尤其是在大批量(large batch)训练中,如何高…...
mfc操作json示例
首先下载cJSON,加入项目; 构建工程,如果出现, fatal error C1010: unexpected end of file while looking for precompiled head 在cJSON.c文件的头部加入#include "stdafx.h"; 看情况,可能是加到.h或者是.cpp文件的头部,它如果有包含头文件, #include &…...
C语言练习(18)
一个班10个学生的成绩,存放在一个一维数组中,要求找出其中成绩最高的学生成绩和该生的序号。 #include <stdio.h>#define STUDENT_NUM 10 // 定义学生数量int main() {int scores[STUDENT_NUM]; // 定义存储学生成绩的一维数组int i;// 输入10个…...
LeetCode 热题 100_全排列(55_46_中等_C++)(递归(回溯))
LeetCode 热题 100_两数之和(55_46) 题目描述:输入输出样例:题解:解题思路:思路一(递归(回溯)): 代码实现代码实现(思路一(…...
编译chromium笔记
编译环境: windows10 powershell7.2.24 git 2.47.1 https://storage.googleapis.com/chrome-infra/depot_tools.zip 配置git git config --global user.name "John Doe" git config --global user.email "jdoegmail.com" git config --global …...
PHP语言的数据库编程
PHP语言的数据库编程 引言 随着互联网的发展,动态网站已成为主流,而动态网站的核心就是与数据库进行交互。PHP(超文本预处理器)是一种流行的开源服务器端脚本语言,被广泛用于Web开发。它以其简单易学和功能强大而受到…...
【PGCCC】PostgreSQL 中表级锁的剖析
本博客解释了 PostgreSQL 中的锁定机制,重点关注数据定义语言 (DDL) 操作所需的表级锁定。 锁定还是解锁的艺术? 人们通常将数据库锁与物理锁进行比较,这甚至可能导致您订购有关锁的历史、波斯锁和撬锁技术的书籍。我们大多数人可能都是通过…...
1.10 自洽性(Self-Consistency):多路径推理的核心力量
自洽性(Self-Consistency):多路径推理的核心力量 随着人工智能尤其是大规模语言模型的不断进化,如何提升其推理能力和决策准确性成为了研究的重点。在这一背景下,**自洽性(Self-Consistency)**作为一种新的推理方法,逐渐展现出其强大的潜力。自洽性方法通过多路径推理…...
【24】Word:小郑-准考证❗
目录 题目 准考证.docx 邮件合并-指定考生生成准考证 Word.docx 表格内容居中表格整体相较于页面居中 考试时一定要做一问保存一问❗ 题目 准考证.docx 插入→表格→将文本转换成表格→✔制表符→确定选中第一列→单击右键→在第一列的右侧插入列→布局→合并单元格&#…...
Linux 信号(Signal)详解
信号(Signal)是 Linux 系统中用于进程间通信的一种机制。它是一种异步通知,用于通知进程发生了某个事件。信号可以来自内核、其他进程或进程自身。 信号的基本概念 信号的作用: 通知进程发生了某个事件(如用户按下 Ct…...
【数据分享】1929-2024年全球站点的逐年最低气温数据(Shp\Excel\免费获取)
气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标!说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 有关气象指标的监测站点数据,之前我们分享过1929-2024年全球气象站点…...
app版本控制java后端接口版本管理
java api version 版本控制 java接口版本管理 1 自定义 AppVersionHandleMapping 自定义AppVersionHandleMapping实现RequestMappingHandlerMapping里面的方法 public class AppVersionHandleMapping extends RequestMappingHandlerMapping {Overrideprotected RequestCondit…...
2024年度总结-CSDN
2024年CSDN年度总结 Author:OnceDay Date:2025年1月21日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 文章目录 2024年CSDN年度总结1. 整体回顾2…...
基于python的博客系统设计与实现
摘要:目前,对于信息的获取是十分的重要,我们要做到的不是裹足不前,而是应该主动获取和共享给所有人。博客系统就能够实现信息获取与分享的功能,博主在发表文章后,互联网上的其他用户便可以看到,…...
服务器日志自动上传到阿里云OSS备份
背景 公司服务器磁盘空间有限,只能存近15天日志,但是有时需要查看几个月前的日志,需要将服务器日志定时备份到某个地方,需要查询的时候有地方可查。 针对这个问题,想到3个解决方法: 1、买一个配置比较低…...
优化使用 Flask 构建视频转 GIF 工具
优化使用 Flask 构建视频转 GIF 工具 优化后的项目概述 在优化后的版本中,我们将实现以下功能: 可设置每个 GIF 的帧率和大小:用户可以选择 GIF 的帧率和输出大小。改进的用户界面:使用更现代的设计使界面更美观、整洁。自定义…...
leetcode:511. 游戏玩法分析 I
难度:简单 SQL Schema > Pandas Schema > 活动表 Activity: ----------------------- | Column Name | Type | ----------------------- | player_id | int | | device_id | int | | event_date | date | | games_playe…...
windows git bash 使用zsh 并集成 oh my zsh
参考了 这篇文章 进行配置,记录了自己的踩坑过程,并增加了 zsh-autosuggestions 插件的集成。 主要步骤: 1. git bash 这个就不说了,自己去网上下,windows 使用git时候 命令行基本都有它。 主要也是用它不方便&…...
【Python运维】Python与网络监控:如何编写网络探测与流量分析工具
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着互联网技术的快速发展,网络性能的监控与分析成为保障信息系统稳定运行的关键环节。本文深入探讨了如何利用Python语言构建高效的网络探…...
OpenCV相机标定与3D重建(61)处理未校准的立体图像对函数stereoRectifyUncalibrated()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 为未校准的立体相机计算一个校正变换。 cv::stereoRectifyUncalibrated 是 OpenCV 库中的一个函数,用于处理未校准的立体图像对。该函…...
字玩FontPlayer开发笔记12 Vue3撤销重做功能
字玩FontPlayer开发笔记12 Vue3撤销重做功能 字玩FontPlayer是笔者开源的一款字体设计工具,使用Vue3 ElementUI开发,源代码:github | gitee 笔记 撤销重做功能是设计工具必不可少的模块,以前尝试使用成熟的库实现撤销重做功能…...
无人机图传模块:深入理解其工作原理与实际效用
无人机图传模块作为无人机系统的关键组成部分,承担着将无人机拍摄的图像和视频实时传输至地面控制站或接收设备的重任。本文将深入探讨无人机图传模块的工作原理及其在实际应用中的效用,帮助读者更好地理解这一技术的奥秘。 一、无人机图传模块的工作原…...
PDF文件提取开源工具调研总结
概述 PDF是一种日常工作中广泛使用的跨平台文档格式,常常包含丰富的内容:包括文本、图表、表格、公式、图像。在现代信息处理工作流中发挥了重要的作用,尤其是RAG项目中,通过将非结构化数据转化为结构化和可访问的信息࿰…...
Linux(Centos 7.6)命令详解:dos2unix
1.命令作用 将Windows格式文件件转换为Unix、Linux格式的文件(也可以转换成其他格式的) 2.命令语法 Usage: dos2unix [options] [file ...] [-n infile outfile ...] 3.参数详解 options: -c, --convmode,转换方式,支持ascii, 7bit, iso, mac,默认…...
梯度提升决策树树(GBDT)公式推导
### 逻辑回归的损失函数 逻辑回归模型用于分类问题,其输出是一个概率值。对于二分类问题,逻辑回归模型的输出可以表示为: \[ P(y 1 | x) \frac{1}{1 e^{-F(x)}} \] 其中 \( F(x) \) 是一个线性组合函数,通常表示为ÿ…...
跨域问题分析及解决方案
1、跨域 指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。 2、同源策略:是指协议,域名,端口都要相同,其中有一个不同都会产生跨域; 3、跨域流程…...
【三国游戏——贪心、排序】
题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1e510; int a[N], b[N], c[N]; int w[4][N]; int main() {int n;cin >> n;for(int i 1; i < n; i)cin >> a[i];for(int i 1; i < n; i)cin >> b[i…...
深入理解 Java 的数据类型与运算符
Java学习资料 Java学习资料 Java学习资料 在 Java 编程中,数据类型与运算符是构建程序的基础元素。它们决定了数据在程序中的存储方式以及如何对数据进行各种操作。 一、数据类型 (一)基本数据类型 整型: 用于存储整数数值&…...
WOA-CNN-GRU-Attention、CNN-GRU-Attention、WOA-CNN-GRU、CNN-GRU四模型对比多变量时序预测
WOA-CNN-GRU-Attention、CNN-GRU-Attention、WOA-CNN-GRU、CNN-GRU四模型对比多变量时序预测 目录 WOA-CNN-GRU-Attention、CNN-GRU-Attention、WOA-CNN-GRU、CNN-GRU四模型对比多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于WOA-CNN-GRU-Attention、…...
(二叉树)
我们今天就开始引进一个新的数据结构了:我们所熟知的:二叉树; 但是我们在引进二叉树之前我们先了解一下树; 树 树的概念和结构: 树是⼀种⾮线性的数据结构,它是由 n ( n>0 ) …...
Linux shell 批量验证端口连通性
脚本 #!/bin/bash # #database check #set -o nounset LOCALIPifconfig | grep inet | head -1 | awk {print $2} | sed s/addr\:// IPLIST192.168.1.99 192.168.1.98 192.168.1.97 PORTLIST81 82 83 84 85 86 check_nc(){ for CHECK_IP in $IPLIST dofor CHECK_PORT in $PORT…...
Java 中实体类与操作类分离
目录 一、为啥要把实体类和操作类分开 二、实体类长啥样,怎么用 三、操作类的使命与实现 四、实战演练:实体类与操作类协同工作 五、拓展思考:这种分离带来的好处与进一步优化 六、总结与展望 家人们,今天我想跟你们唠唠我在…...
创建 pdf 合同模板
创建 pdf 合同模板 一、前言二、模板展示三、制作过程 一、前言 前段时间要求创建“pdf”模板,学会了后感觉虽然简单,但开始也折腾了好久,这里做个记录。 二、模板展示 要创建这样的模板 三、制作过程 新建一个“Word”,这里命…...
【Prometheus】PromQL进阶用法
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
BOBO小火炬全套源码XE修复版2025(火炬天花板二次开发版)
《小火炬全套源码 传奇游戏源码讲解》 小火炬全套源码是一种用于开发经典传奇类游戏的源码包。传奇游戏作为一款经典的多人在线角色扮演游戏(MMORPG),有着庞大的用户基础和强大的游戏生态。小火炬全套源码主要提供了从基础架构到核心功能的完…...
【基于无线电的数据通信链】Link 11 仿真测试
〇、废话 Link 11 仿真测试 涉及多个方面,包括信号仿真、协议模拟、数据链路层的仿真以及网络性能评估等。Link 11 是一种基于 HF(高频) 或 UHF(超高频) 波段的无线通信协议,主要用于军事通信系统中。为了…...
WPF实战案例 | C# WPF实现计算器源码
WPF实战案例 | C# WPF实现计算器源码 一、设计来源计算器应用程序讲解1.1 主界面1.2 计算界面 二、效果和源码2.1 界面设计(XAML)2.2 代码逻辑(C#)2.3 实现步骤总结 源码下载更多优质源码分享 作者:xcLeigh 文章地址&a…...
WebSocket 和 Socket 的区别
一、协议层次和工作方式 1.1 )Socket 1.1.1)Socket位于传输层,通常使用TCP或UDP协议 1.1.2)提供了一个通用的网络编程接口,允许应用程序通过它发送和接收数据 1.1.3)一般需要手动管理连接,错…...
Matlab自学笔记四十五:日期时间型和字符、字符串以及double型的相互转换方法
1.说明 在Matlab中,大多数函数都有这样的功能:创建函数本身具有转换的功能,例如double函数,可以创建双精度浮点数,也可以把输入参数转换成双精度浮点数,再例如string,可以创建字符串࿰…...
Python基础学习(六)unittest 框架
1.介绍 是 Python自带的单元测试框架 - 自带的, 可以直接使用, 不需要单外安装 - 测试人员,用来做自动化测试, 作为自动化测试的执行框架,即管理和执行用例的 核心要素: TestCase 测试用例, 这个测试用例是 unittest 的组成部分,作用是用来书写真正的…...
Python数据可视化(够用版):懂基础 + 专业的图表抛给Tableau等专业绘图工具
我先说说文章标题中的“够用版”啥意思,为什么这么写。 按照我个人观点,在使用Python进行数据分析时,我们有时候肯定要结合到图表去进行分析,去直观展现数据的规律和特定,那么我们肯定要做一些简单的可视化࿰…...
麒麟操作系统服务架构保姆级教程(十三)tomcat环境安装以及LNMT架构
如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情 之前咱们学习了LNMP架构,但是PHP对于技术来说确实是老掉牙了,PHP的市场占有量越来越少了,我认识一个10年的PHP开发工程师,十年工资从15k到今天的6k&am…...
Docker集成onlyoffice实现预览功能
1.拉取镜像 docker pull onlyoffice/documentserver 2. 数据卷挂载 mkdir -p app/onlyoffice/DocumentServer/logs mkdir -p app/onlyoffice/DocumentServer/data mkdir -p app/onlyoffice/DocumentServer/lib mkdir -p app/onlyoffice/DocumentServer/db 3.运行容器 docker ru…...
Flowable 管理各业务流程:流程设计器 (获取流程模型 XML)、流程部署、启动流程、流程审批、流程挂起和激活、任务分配
文章目录 引言I 表结构主要表前缀及其用途核心表II 流程设计器(Flowable BPMN模型编辑器插件)Flowable-UIvue插件III 流程部署部署步骤例子:根据流程模型ID部署IV 启动流程启动步骤ACT_RE_PROCDEF:流程定义相关信息例子:根据流程 ID 启动流程V 流程审批审批步骤Flowable 审…...
BladeDISC++:Dynamic Shape AI 编译器下的显存优化技术
近年来,随着深度学习技术的迅猛发展,越来越多的模型展现出动态特性,这引发了对动态形状深度学习编译器(Dynamic Shape AI Compiler)的广泛关注。本文将介绍阿里云 PAI 团队近期发布的 BladeDISC项目,探讨在动态场景下如何优化深度…...
FFmpeg常用命令
文章目录 一、 FFmpeg 音视频的处理流程二、FFmpeg 常用命令2.1、查看本机支持的采集设备2.2、 录制视频2.2.1、原始视频2.2.2、编码的视频 2.3、录制音频:2.3.1、原始音频2.3.2、编码的音频 2.4、录制音视频:2.5、文件格式转换:2.6、提取音频…...