Spring Boot自动配置原理:如何实现零配置启动

引言

在现代软件开发中,Spring 框架已经成为 Java 开发领域不可或缺的一部分。而 Spring Boot 的出现,更是为 Spring 应用的开发带来了革命性的变化。Spring Boot 的核心优势之一就是它的“自动配置”能力,它极大地简化了 Spring 应用的配置过程,使得开发者可以专注于业务逻辑的实现,而无需花费大量时间在繁琐的配置文件上。本文将深入探讨 Spring Boot 自动配置的原理,分析它是如何实现“零配置启动”的,并通过实际代码示例帮助读者更好地理解和应用这一强大特性。

一、Spring Boot 自动配置的背景与意义

(一)传统 Spring 应用的配置痛点

在传统 Spring 应用开发中,开发者需要手动配置大量的 XML 文件或注解,以完成诸如 Bean 的定义、组件扫描、事务管理、数据源配置等任务。例如,一个简单的 Spring MVC 应用可能需要以下配置:

  1. XML 配置文件:定义 Bean、数据源、事务管理器等。

  2. 注解配置:使用 @Configuration@Component@Service 等注解来声明组件。

  3. 环境配置:配置数据库连接信息、外部服务地址等。

这种配置方式不仅繁琐,而且容易出错,尤其是对于新手开发者来说,学习成本较高。此外,随着项目规模的扩大,配置文件的维护也变得越来越复杂。

(二)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 应用的核心注解,它是一个组合注解,包含了以下三个注解:

  1. @SpringBootConfiguration:标识当前类是一个 Spring Boot 配置类。

  2. @EnableAutoConfiguration:启用 Spring Boot 的自动配置机制。

  3. @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) 导入了一个特殊的类 AutoConfigurationImportSelectorAutoConfigurationImportSelector 是一个 DeferredImportSelector,它会在 Spring 容器启动时,根据项目中引入的依赖和类路径中的资源,动态地选择并导入一系列的自动配置类。

java复制

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}

(三)AutoConfigurationImportSelector

AutoConfigurationImportSelector 是自动配置的入口类,它通过以下步骤实现自动配置:

  1. 加载配置类列表:通过 SpringFactoriesLoader 加载 META-INF/spring.factories 文件中定义的自动配置类。

  2. 过滤配置类:根据项目中引入的依赖和类路径中的资源,过滤掉不适用的配置类。

  3. 导入配置类:将过滤后的配置类导入到 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 提供了一系列内置的条件注解,例如:

  1. @ConditionalOnClass:当指定的类在类路径中时,条件成立。

  2. @ConditionalOnMissingBean:当容器中没有指定的 Bean 时,条件成立。

  3. @ConditionalOnProperty:当指定的属性存在且满足特定值时,条件成立。

  4. @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 注解会触发自动配置机制。以下是自动配置的启动流程:

  1. 加载 spring.factories 文件AutoConfigurationImportSelector 通过 SpringFactoriesLoader 加载 META-INF/spring.factories 文件中定义的自动配置类。

  2. 过滤配置类:根据条件注解过滤掉不适用的配置类。

  3. 导入配置类:将过滤后的配置类导入到 Spring 容器中。

  4. 初始化 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 提供的一个工具类,用于评估条件注解是否成立。以下是条件注解的过滤过程:

  1. 解析条件注解ConditionEvaluator 解析配置类上的条件注解。

  2. 评估条件:根据条件注解的规则,评估条件是否成立。

  3. 过滤配置类:如果条件不成立,则过滤掉该配置类。

例如,@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,包括 DispatcherServletRequestMappingHandlerMapping 等。

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 应用的自动配置过程:

  1. 加载 spring.factories 文件AutoConfigurationImportSelector 加载 META-INF/spring.factories 文件中定义的自动配置类,包括 WebMvcAutoConfigurationServletWebServerFactoryAutoConfiguration 等。

  2. 过滤配置类:根据条件注解过滤掉不适用的配置类。例如,@ConditionalOnWebApplication 注解会过滤掉非 Web 应用的配置类。

  3. 导入配置类:将过滤后的配置类导入到 Spring 容器中。

  4. 初始化 Bean:Spring 容器根据导入的配置类初始化相关的 Bean,包括 DispatcherServletRequestMappingHandlerMapping 等。

(二)数据源的自动配置

当开发者引入了 Spring Boot 的数据源依赖后,Spring Boot 会自动配置一个数据源,并完成 JPA 或 MyBatis 的初始化。以下是数据源的自动配置过程:

  1. 加载 spring.factories 文件AutoConfigurationImportSelector 加载 META-INF/spring.factories 文件中定义的自动配置类,包括 DataSourceAutoConfigurationJpaAutoConfiguration 等。

  2. 过滤配置类:根据条件注解过滤掉不适用的配置类。例如,@ConditionalOnClass 注解会过滤掉没有引入相关依赖的配置类。

  3. 导入配置类:将过滤后的配置类导入到 Spring 容器中。

  4. 初始化 Bean:Spring 容器根据导入的配置类初始化相关的 Bean,包括 DataSourceEntityManagerFactory 等。

(三)自定义自动配置

开发者可以通过创建自己的自动配置类来扩展 Spring Boot 的自动配置机制。以下是自定义自动配置的步骤:

  1. 创建自动配置类:创建一个带有 @Configuration 注解的类,并在类上添加条件注解。

  2. 定义 Bean:在自动配置类中定义相关的 Bean。

  3. 注册到 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 自动配置的优势与局限性

(一)优势

  1. 简化配置:Spring Boot 的自动配置机制极大地简化了 Spring 应用的配置过程,开发者无需手动编写大量的配置代码。

  2. 提高效率:开发者可以专注于业务逻辑的实现,而无需花费大量时间在配置文件的维护上。

  3. 易于上手:Spring Boot 的自动配置机制使得 Spring 框架更加易于上手和使用,降低了开发门槛。

  4. 动态配置:通过条件注解,Spring Boot 能够根据项目的实际情况动态地选择和加载配置类,提高了配置的灵活性。

(二)局限性

  1. 配置覆盖:虽然 Spring Boot 提供了大量的默认配置,但在某些情况下,开发者可能需要手动覆盖默认配置。

  2. 复杂项目:对于一些复杂的项目,自动配置可能无法完全满足需求,开发者需要手动进行一些配置。

  3. 性能问题:自动配置机制会加载和评估大量的配置类,可能会影响应用的启动性能。

六、如何优化 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 的启动性能:

  1. 减少依赖:只引入项目中实际需要的依赖,避免引入不必要的依赖。

  2. 延迟加载:通过 @Lazy 注解延迟加载某些 Bean,减少启动时的初始化开销。

  3. 优化配置:通过自定义配置类优化自动配置的性能。

七、总结

Spring Boot 的自动配置机制是其核心特性之一,它通过一系列默认的配置和动态的条件注解,极大地简化了 Spring 应用的配置过程,实现了“零配置启动”。开发者只需引入相关的依赖,Spring Boot 就会自动完成所有必要的配置。通过本文的介绍,读者应该对 Spring Boot 自动配置的原理有了深入的理解,并能够通过实践案例更好地应用这一强大特性。

然而,Spring Boot 的自动配置机制也存在一些局限性。在某些情况下,开发者可能需要手动覆盖默认配置或禁用某些自动配置类。此外,自动配置机制可能会对应用的启动性能产生一定的影响。因此,开发者需要根据项目的实际情况,合理地使用和优化 Spring Boot 的自动配置机制,以充分发挥其优势。

总之,Spring Boot 的自动配置机制为 Spring 应用的开发带来了极大的便利,它不仅提高了开发效率,还降低了开发门槛。随着 Spring Boot 的不断发展和完善,我们有理由相信它将在未来的 Java 开发领域中发挥更加重要的作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/67754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型GUI系列论文阅读 DAY2续2:《使用指令微调基础模型的多模态网页导航》

摘要 自主网页导航的进展一直受到以下因素的阻碍&#xff1a; 依赖于数十亿次的探索性交互&#xff08;通常采用在线强化学习&#xff09;&#xff0c;依赖于特定领域的模型设计&#xff0c;难以利用丰富的跨领域数据进行泛化。 在本研究中&#xff0c;我们探讨了基于视觉-语…

在视频汇聚平台EasyNVR平台中使用RTSP拉流的具体步骤

之前有用户反馈&#xff0c;在EasyNVR平台中添加Pull时使用海康设备的RTSP流地址无法播放。经过研发的优化及一系列严谨的验证流程&#xff0c;我们已确认优化后的EasyNVR平台&#xff0c;通过Pull方式添加海康设备的RTSP流已经能够正常播放。以下是具体的操作步骤&#xff1a;…

Debezium日常分享系列之:对于从Oracle数据库进行快照的性能优化

Debezium日常分享系列之&#xff1a;对于从Oracle数据库进行快照的性能优化 源数据库Kafka Connect监控测试结果 源数据库 Oracle 19c&#xff0c;本地&#xff0c;CDB数据库主机的I/O带宽为6 GB/s&#xff0c;由此主机上运行的所有数据库共享临时表空间由42个文件组成&#x…

C++书籍 第一部分专业C++程序设计概述

1&#xff0c;必不可少的“hello world” #include<iostream>int main(int argc, char** argv) {std::cout << "hello world" << std::endl;return 0; } 这个是一个极其简单的程序&#xff0c;虽然没有多大简直&#xff0c;但是可以体现c程序格式方…

VIVADO ILA IP进阶使用之任意设置ILA的采样频率

VIVADO ILA IP进阶使用之任意设置ILA的采样频率 VIVADO ILA IP和VIO IP结合使用任意设置ILA的采样频率 目录 前言 一、VIO IP的配置 二、ILA IP的配置 三、测试代码 四、测试结果 总结 前言 VIVADO中编写完程序上板测试时经常会用到viavdo自带的ILA逻辑分析仪IP核&#x…

spring @EnableAspectJAutoProxy @Aspect的使用和源码流程

目录 测试代码EnableAspectJAutoProxyAspectJAutoProxyRegistrarAnnotationAwareAspectJAutoProxyCreatororg.springframework.context.support.AbstractApplicationContext#registerBeanPostProcessors 实例化AnnotationAwareAspectJAutoProxyCreator bean "a"的代理…

Mono里运行C#脚本29—mono_trampolines_init

一、概念解释 在计算机编程中,trampoline 通常是一段代码,它起到一个中间跳转的作用。它就像一个跳板,程序可以先跳转到这个跳板上,然后再从跳板跳转到最终的目的地。这种技术在许多不同的场景中都有应用,以下是一些主要方面: 函数调用方面: 当涉及到不同执行环境或不…

【BUUCTF】[GXYCTF2019]BabySQli

进入页面如下 尝试万能密码注入 显示这个&#xff08;qyq&#xff09; 用burp suite抓包试试 发现注释处是某种编码像是base编码格式 MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5 可以使用下面这个网页在线工具很方便…

重生之我在异世界学编程之算法与数据结构:深入堆篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 正文一、堆的基本概念二、堆的存储表示三…

《自动驾驶与机器人中的SLAM技术》ch8:基于预积分和图优化的紧耦合 LIO 系统

目录 1 预积分 LIO 系统的经验 2 预积分图优化的顶点 3 预积分图优化的边 3.1 NDT 残差边&#xff08;观测值维度为 3 维的单元边&#xff09; 4 基于预积分和图优化 LIO 系统的实现 4.1 IMU 静止初始化 4.2 使用预积分预测 4.3 使用 IMU 预测位姿进行运动补偿 4.4 位姿配准部…

软件测试—— 接口测试(HTTP和HTTPS)

软件测试—— 接口测试&#xff08;HTTP和HTTPS&#xff09; HTTP请求方法GET特点使用场景URL结构URL组成部分URL编码总结 POST特点使用场景请求结构示例 请求标头和响应标头请求标头&#xff08;Request Headers&#xff09;示例请求标头 响应标头&#xff08;Response Header…

【Excel超实用,VLOOKUP函数,通过excel数据精准匹配,将一个excel文件的某列数据,用另一个excel文件快速填充】

1、使用背景 如下图1所示&#xff0c;1.xlsx文件&#xff0c;有两列数据&#xff0c;一列序号&#xff0c;一列内容&#xff0c; 我现在需要将第二列的内容快速完成填充&#xff0c;并且有相应的excel模板作为参照。 图1 如图2所示&#xff0c;2.xlsx是模板文件&#xff0c;序…

FastExcel 新一代的潮流 (EasyExcel)

目录 简介 FastExcel的特点 FastExcel使用方法详解 创建实体类和监听器 实现写入和读取功能 Excel转换为PDF 小结 FastExcel与EasyExcel的区别 结论 简介 FastExcel是由原EasyExcel作者在阿里巴巴宣布停止维护EasyExcel之后推出的升级版框架。它继承了EasyExcel的所有…

Transformer详解:Attention机制原理

前言 Hello&#xff0c;大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者&#xff0c;本系列文章是作者参加DataWhale2025年1月份学习赛&#xff0c;旨在讲解Transformer模型的理论和实践。&#x1f632; 本文将详细探讨Attention机制的原理…

Android 11适配全攻略:从理论到实践

随着Google正式发布Android 11&#xff0c;开发者们迎来了新的挑战和机遇。Android 11不仅带来了全新的用户体验和功能提升&#xff0c;还要求开发者们对应用进行相应的适配&#xff0c;以确保应用的兼容性和稳定性。本文将从理论到实践&#xff0c;全面解析Android 11的适配攻…

python程序跑起来后,然后引用的数据文件发生了更新,python读取的数据会发生变化吗

在 Python 程序运行过程中&#xff0c;如果引用的数据文件被更新&#xff0c;程序能否读取到更新后的数据&#xff0c;取决于以下几个因素&#xff1a; 1. 是否动态读取文件 如果 Python 程序在运行过程中动态读取文件&#xff08;例如通过循环或定时机制反复打开文件读取&…

PyTorch使用教程(14)-如何正确地选择损失函数?

在机器学习和深度学习的广阔领域中&#xff0c;损失函数&#xff08;Loss Function&#xff09;扮演着至关重要的角色。它不仅是衡量模型预测结果与实际数据之间差异的关键指标&#xff0c;还是指导模型优化方向、影响最终性能的核心要素。选择合适的损失函数&#xff0c;对于提…

P1825 [USACO11OPEN] Corn Maze S 刷题笔记

P1825 [USACO11OPEN] Corn Maze S - 洛谷 | 计算机科学教育新生态 定义状态空间 结构体 精简代码 遇到多种情况判断不要全写进check里面 分开写 传送门是大写字母 A-z 其acll码值 是 65-90 我们将传送门代表的字母-65 就可以将其值映射到 0-26 从而存下相应的传送门坐标…

01设计模式(D3_设计模式类型 - D3_行为型模式)

目录 一、模版方法模式 1. 基本介绍 2. 应用案例一&#xff1a;豆浆制作问题 需求 代码实现 模板方法模式的钩子方法 3. View的draw&#xff08;Android&#xff09; Android中View的draw方法就是使用了模板方法模式 模板方法模式在 Spring 框架应用的源码分析 知识小…

Nginx在Linux中的最小化安装方式

1. 安装依赖 需要安装的东西&#xff1a; wget​&#xff0c;方便我们下载Nginx的包。如果是在Windows下载&#xff0c;然后使用SFTP上传到服务器中&#xff0c;那么可以不安装这个软件包。gcc g​&#xff0c;Nginx是使用C/C开发的服务器&#xff0c;等一下安装会用到其中的…