Springboot 梳理

  一、Springboot 特性

  1. 方便创建可独立运行的spring应用程序
  2. 直接内嵌Tomcat等服务
  3. 简化了项目的构建配置
  4. 为spring及第三方库提供自动配置
  5. 提供生产级特性
  6. 无需生成代码或者进行xml配置

二、四大核心

  1. 自动配置
  2. 起步依赖
  3. 命令行界面
  4. Actuator - 生成级的特性

三、自动配置的实现原理

  1. 自动配置
    1. 基于添加JAR依赖自动对Spring Boot应用程序进行配置
    2. spring-boot-autoconfiguration
  2. 开启自动配置
    1. @EnableAutoConfiguration
      1. exclude = Class<?> []
    2. @SpringBootApplication

四、@EnableAutoConfiguration

  1. @Import({AutoConfigurationImportSelector.class})

  2.  META-INF/spring.factories

    1. org.springframework.boot.autoconfigure.AutoConfiguratio

  3. 条件注解
    1. @Conditional
    2. @ConditionalOnClass
    3. @ConditionalOnBean
    4. @ConditionalOnMissingBean
    5. @ConditionalOnProperty
    6. ...
  4. 了解自动配置的情况
    1. 观察自动配置的判断结果
      1. 命令行添加: --debug
    2. CONDITIONS EVALUATION REPORT
      1. Positive matches
      2. Negative matches
      3. Exclusions
      4. Unconditional classes

测试用例:

todo:手写一个自动配置

五、起步依赖

  1. 直接面向功能
  2. 一站获得所有相关依赖,不再复制粘贴
  3. 官方的Starters:如:spring-boot-starter-*

todo:手写一个起步依赖:*-starter

六、外化配置加载顺序

Spring Boot 的外化配置加载顺序遵循特定的优先级规则,高优先级的配置会覆盖低优先级的。以下是详细的配置源加载顺序及规则:


一、配置源的优先级(从高到低)

  1. 命令行参数
    通过 --key=value 传递的参数,如 java -jar app.jar --server.port=8081

  2. SPRING_APPLICATION_JSON 属性
    通过环境变量或系统属性传递的 JSON 格式配置,如 SPRING_APPLICATION_JSON='{"server":{"port":8081}}'

  3. Java 系统属性
    使用 -D 参数设置的属性,如 -Dserver.port=8081

  4. 操作系统环境变量
    如 SERVER_PORT=8081

  5. Profile-Specific 配置文件(外部)
    位于项目外部的 application-{profile}.properties 或 YAML 文件(如 ./config/application-dev.yml)。

  6. Profile-Specific 配置文件(内部)
    位于项目内部的 application-{profile}.properties 或 YAML 文件(如 classpath:/application-dev.yml)。

  7. 常规配置文件(外部)
    项目外部的 application.properties 或 YAML 文件(如 ./config/application.yml)。

  8. 常规配置文件(内部)
    项目内部的 application.properties 或 YAML 文件(如 classpath:/application.yml)。

  9. @PropertySource 注解
    通过 @PropertySource 加载的配置文件。

  10. 默认属性
    通过 SpringApplication.setDefaultProperties() 设置的默认属性。


二、配置文件的位置优先级

Spring Boot 会从以下位置按顺序加载配置文件(优先级从高到低):

  1. 当前目录的 /config 子目录
    file:./config/

  2. 当前目录
    file:./

  3. Classpath 的 /config 包
    classpath:/config/

  4. Classpath 根目录
    classpath:/

同一位置的加载顺序

  • 先加载 application.properties,再加载 application.yml

  • 若激活了 Profile(如 dev),则加载 application-{profile}.properties 或 yml,覆盖默认配置。


三、覆盖规则

  1. 高优先级位置 > 低优先级位置
    例如,外部的 file:./config/application.properties 会覆盖内部的 classpath:/application.properties

  2. 同一位置下,Profile-Specific 配置 > 默认配置
    例如,file:./config/application-dev.yml 会覆盖同位置的 file:./config/application.yml

  3. 非配置文件源 > 配置文件源
    如命令行参数、环境变量等优先级高于所有配置文件。


四、示例说明

假设以下配置存在:

  • 命令行参数:--server.port=8081

  • 外部文件 ./config/application.ymlserver.port: 8082

  • 内部文件 classpath:/application-dev.yml(激活 dev Profile):server.port: 8083

最终生效的端口为 8081(命令行参数优先级最高)。


五、高级配置

  • 自定义配置文件路径
    通过 --spring.config.location=classpath:/custom/ 或 spring.config.additional-location 指定额外路径。

  • 多文档 YAML 文件
    在单个 YAML 文件中使用 --- 分隔符定义不同 Profile 的配置(需 Spring Boot 2.4+)。


总结

Spring Boot 的配置加载顺序以“就近覆盖”为原则,同时支持灵活的外部化配置。理解这一机制有助于在不同环境(开发、测试、生产)中高效管理配置。

七、PropertySource

@PropertySource 是 Spring 框架提供的注解,用于向 Spring 的 Environment 中添加自定义的配置文件。它通常用于加载非默认的 application.properties 或 application.yml 文件,以扩展或覆盖默认配置。


一、@PropertySource 的作用

  1. 加载外部配置文件
    显式指定自定义的配置文件(如 custom.properties),将配置注入到 Spring 环境中。

  2. 支持多环境配置
    结合 @Profile 注解,按需加载不同环境的配置。

  3. 模块化配置
    将大型项目的配置拆分为多个文件,按模块加载。


二、基本用法

1. 加载单个配置文件

java

复制

@Configuration
@PropertySource("classpath:config/custom.properties")
public class AppConfig {
}
2. 加载多个配置文件

java

复制

@Configuration
@PropertySource({"classpath:config/db.properties", "classpath:config/redis.properties"})
public class AppConfig {
}

三、典型用例说明

1. 加载自定义配置文件

假设有一个 custom.properties

properties

复制

app.name=MySpringBootApp
app.version=1.0.0

在 Java 配置类中加载:

java

复制

@Configuration
@PropertySource("classpath:custom.properties")
public class AppConfig {
    @Autowired
    private Environment env;

    @Bean
    public MyAppInfo myAppInfo() {
        MyAppInfo info = new MyAppInfo();
        info.setName(env.getProperty("app.name"));
        info.setVersion(env.getProperty("app.version"));
        return info;
    }
}

2. 结合 @Profile 按环境加载

假设有 dev 和 prod 环境的配置:

  • config-dev.properties

  • config-prod.properties

通过 @Profile 按需激活:

java

复制

@Configuration
@Profile("dev")
@PropertySource("classpath:config-dev.properties")
public class DevConfig { }

@Configuration
@Profile("prod")
@PropertySource("classpath:config-prod.properties")
public class ProdConfig { }

3. 加载外部路径的配置文件

从文件系统绝对路径加载:

java

复制

@Configuration
@PropertySource("file:/etc/myapp/config.properties")
public class ExternalConfig { }

4. 加载 YAML 文件(需自定义处理)

默认 @PropertySource 不支持 YAML,需借助 YamlPropertySourceFactory

java

复制

@Configuration
@PropertySource(
    value = "classpath:config/custom.yml",
    factory = YamlPropertySourceFactory.class
)
public class YamlConfig { }

自定义 YamlPropertySourceFactory

java

复制

public class YamlPropertySourceFactory implements PropertySourceFactory {
    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
        YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
        factory.setResources(resource.getResource());
        Properties properties = factory.getObject();
        return new PropertiesPropertySource(
            (name != null ? name : resource.getResource().getFilename()),
            properties
        );
    }
}

四、覆盖规则与优先级

  • @PropertySource 加载的配置优先级低于命令行参数、环境变量等,但高于默认配置(application.properties)。

  • 覆盖顺序:后加载的配置会覆盖先加载的配置。例如:

    java

    复制

    @PropertySource({"file:config1.properties", "file:config2.properties"})

    config2.properties 中的值会覆盖 config1.properties


五、注意事项

  1. 不支持 YAML 的默认加载
    需要自定义 PropertySourceFactory 才能加载 YAML 文件。

  2. 路径问题

    • classpath: 表示从类路径加载。

    • file: 表示从文件系统加载。

  3. Profile 激活依赖
    结合 @Profile 使用时,需确保 Profile 已正确激活(如通过 spring.profiles.active)。

  4. 多模块配置冲突
    避免多个模块加载同名属性导致意外覆盖。


六、总结

@PropertySource 的典型使用场景:

  • 加载非标准名称的配置文件(如 custom.properties)。

  • 按模块或环境拆分配置。

  • 集成遗留系统或第三方库的配置文件。

通过灵活使用 @PropertySource,可以实现更清晰的配置管理和更高的代码可维护性。

八、Actuator

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

unity console日志双击响应事件扩展

1 对于项目中一些比较长的日志&#xff0c;比如前后端交互协议具体数据等&#xff0c;这些日志内容可能会比较长&#xff0c;在unity控制面板上查看不是十分方便&#xff0c;我们可以对双击事件进行扩展&#xff0c;将日志保存到一个文本中&#xff0c;然后用系统默认的文本查看…

GPIO相关寄存器

共七种寄存器用于控制GPIO GPIOx_CRL&#xff08;常用&#xff09; GPIOx_CRH&#xff08;常用&#xff09; GPIOx_IDR&#xff08;常用&#xff09; GPIOx_ODR&#xff08;常用&#xff09; GPIOx_BSRR&#xff08;常用&#xff09; GPIOx_BRR&#xff08;不常用&#x…

简单多状态 dp 问题(典型算法思想)—— OJ例题算法解析思路

目录 一、面试题 17.16. 按摩师 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; 代码思路解析&#xff1a; 问题分析&#xff1a; 动态规划定义&#xff1a; 状态转移方程&#xff1a; 初始化&#xff1a; 填表&#xff1a; 返回值&#xff1a; 优化空…

深度解码!清华大学第六弹《AIGC发展研究3.0版》

在Grok3与GPT-4.5相继发布之际&#xff0c;《AIGC发展研究3.0版》的重磅报告——这份长达200页的行业圣经&#xff0c;不仅预测了2025年AI技术爆发点&#xff0c;更将「天人合一」的东方智慧融入AI伦理建构&#xff0c;堪称数字时代的《道德经》。 文档&#xff1a;清华大学第…

基于Hadoop的热门旅游景点推荐数据分析与可视化系统(基于Django大数据技术的热门旅游景点数据分析与可视化)

基于Hadoop大数据技术的热门旅游景点推荐数据分析与可视化系统设计与实现&#xff08;基于大数据技术的Django热门旅游景点数据分析与可视化系统设计与实现&#xff09; 1. 开发工具和实现技术 Pycharm, Python3.7&#xff0c;Django框架&#xff0c;Hadoop&#xff0c;Spark…

bert模型笔记

1.各预训练模型说明 BERT模型在英文数据集上提供了两种大小的模型&#xff0c;Base和Large。Uncased是意味着输入的词都会转变成小写&#xff0c;cased是意味着输入的词会保存其大写&#xff08;在命名实体识别等项目上需要&#xff09;。Multilingual是支持多语言的&#xff0…

dify 工作流 迭代

测试工作流&#xff1b;输入 测试工作流&#xff1b;运行结果 迭代&#xff1b;item使用解构&#xff1b;解析出每个对象

加载Ubuntu配置(source /etc/profile)

source /etc/profile 加载Ubuntu配置 加载前 加载后 启动项目&#xff1a; 问题&#xff1a; 当时安装JAVA非root账户

DeepSeek开源Day4:DualPipeEPLB技术详解

2 月 24 日&#xff0c;DeepSeek 启动 “开源周”&#xff0c;第四个开源的代码库为 DualPipe 与 EPLB&#xff08;一下发布了两个&#xff09;。DualPipe 与 EPLB 依然使用了大量与 Hopper 架构绑定的技术。 DualPipe 是由 DeepSeek-AI 团队开发的一种双向流水线并行通信算法&…

【计算机网络入门】初学计算机网络(九)

目录 1.令牌传递协议 2. 局域网&IEEE802 2.1 局域网基本概念和体系结构 3. 以太网&IEEE802.3 3.1 MAC层标准 3.1.1 以太网V2标准 ​编辑 3.2 单播广播 3.3 冲突域广播域 4. 虚拟局域网VLAN 1.令牌传递协议 先回顾一下令牌环网技术&#xff0c;多个主机形成…

数据结构 常见的排序算法

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;数据结构 目录 &#x1f33b;个人主页&#xff1a;路飞雪吖~ 一、插入排序 &#x1f31f;直接插入排序 &#x1f31f;希尔排序 二、选择排序 &#x1f31f;选择排序 &#x1f31f;堆排序…

vscode离线配置远程服务器

目录 一、前提 二、方法 2.1 查看vscode的commit_id 2.2 下载linux服务器安装包 2.3 安装包上传到远程服务器&#xff0c;并进行文件解压缩 三、常见错误 Failed to set up socket for dynamic port forward to remote port&#xff08;vscode报错解决方法&#xff09;-C…

洛谷 P1480 A/B Problem(高精度详解)c++

题目链接&#xff1a;P1480 A/B Problem - 洛谷 1.题目分析 1&#xff1a;说明这里是高精度除以低精度的形式&#xff0c;为什么不是高精度除以高精度的形式&#xff0c;是因为它很少见&#xff0c;它的模拟方式是用高精度减法来做的&#xff0c;并不能用小学列竖式的方法模拟…

SpringMVC学习(controller层加载控制与(业务、功能)bean加载控制、Web容器初始化配置类)(3)

目录 一、SpringMVC、Spring的bean加载控制。 &#xff08;1&#xff09;实际开发的包结构层次。 &#xff08;2&#xff09;如何"精准"控制两个容器分别加载各自bean。(分析) <1>SpringMVC相关bean加载控制。(方法) <2>Spring相关bean加载控制。(方法) …

R的安装以及jupyter配置windows

今天&#xff0c;跟大家分享一下R的安装以及jupyter的配置 首先&#xff0c;我们去R的官网&#xff0c;打开进入下图web页面&#xff1a; 点击download R: 进入清华园镜像&#xff0c;根据系统来选择下载对应的R&#xff1a; 我这里用的Windows&#xff0c;就以windows为例…

【MySQL】表的增删查改(CRUD)(下)

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 本篇是继上篇的下篇&#xff0c;如果上篇没有看过小伙伴&#xff0c;可以先看看我的上一篇再来看一下这一篇【MySQL】表的增删查改&#xff08;CRUD&#xff09;&#xff08;上…

esp32s3聊天机器人(二)

继续上文&#xff0c;硬件软件准备齐全&#xff0c;介绍一下主要用到的库 sherpa-onnx 开源的&#xff0c;语音转文本、文本转语音、说话人分类和 VAD&#xff0c;关键是支持C#开发 OllamaSharp 用于连接ollama&#xff0c;如其名C#开发 虽然离可玩还有一段距离&#xff0…

在 IntelliJ IDEA(2024) 中创建 JAR 包步骤

下是在 IntelliJ IDEA 中创建 JAR 包的详细的步骤&#xff1a; ​1. 选择File -> Project Structure->Artifacts&#xff0c; (1)点击➕新建&#xff0c;如下图所示&#xff1a; (2)选择JAR->Empty (3)输入jar包名称&#xff0c;确定输出路径 &#xff08;4&#…

自学Java-JavaSE基础加强(多线程)

自学Java-JavaSE基础加强&#xff08;多线程&#xff09; 一、创建线程1、方式一&#xff1a;继承Thread类小结 2、方式二&#xff1a;实现Runnable接口小结 3、方式三&#xff1a;实现Callable接口4、小结 二、线程的常用方法三、线程安全1、认识线程安全2、模拟线程安全问题3…

香港电讯CE2.0网络全面升级,100G服务支援企业关键应用

随着人工智能&#xff08;AI&#xff09;和新兴科技的应用日益俱增&#xff0c;安全可靠、高速稳定的网络对现今企业而言尤关重要。香港电讯作为香港及大湾区企业信赖的科技解决方案提供者&#xff0c;一直致力为企业客户提供面向未来的网络方案&#xff0c;为不同行业的网络需…