application.yaml与bootstrap.yaml的使用

 更新时间:2024年08月23日 10:16:35   作者:Surfing鲨鱼  
这篇文章主要介绍了application.yaml与bootstrap.yaml的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

application.yaml与bootstrap.yaml

你对这两个文件有没有清晰认识?

application.yaml

  • 用途:主要用于应用程序的主要配置,包括数据库连接信息、端口号、日志级别、自定义属性等应用级别的设置。这是Spring Boot应用中最常见的配置文件,几乎所有自定义配置都会放在这里。
  • 加载时机application.yaml 在Spring应用上下文初始化之后被加载,这意味着大部分Bean的创建和自动配置都会考虑到这里的配置信息。
  • 覆盖:可以通过命令行参数、环境变量、Java系统属性等方式覆盖application.yaml中的配置。

bootstrap.yaml

  • 用途:主要用于应用程序的引导阶段配置,特别是与Spring Cloud相关的配置,如配置中心(Config Server)的地址。它的内容在应用程序的上下文初始化之前被加载,适合配置那些需要在Spring应用上下文启动之前就需要读取的属性,比如用来配置从何处加载主配置文件的地址。
  • 加载时机bootstrap.yaml 文件比application.yaml更早加载,它在应用程序的引导阶段就被处理,用于应用程序上下文初始化之前的配置,比如配置中心的配置。
  • 用途示例:当使用Spring Cloud Config Server来集中管理配置时,你需要在bootstrap.yaml中配置Config Server的地址,这样Spring Cloud会先从Config Server获取配置信息,再初始化Spring Boot应用。

这两大段在讲什么 不能简单讲一下吗?

知识储备

  • Bean:实现控制反转的一个java对象 加入到ioc容器当中
  • Spring上下文:Bean管理 资源访问 消息传递 生命周期管理 我就简单讲一下第一个【第一个最好讲】 Bean管理 : ApplicationContext 读取配置元数据(xml文件 java配置 注解 )根据这些数据创建Bean 实现控制反转

Spring上下文启动:加载配置 -》 bean读取 -》 bean的实例化 -》 bean的初始化 -》 启动后监听

容器初始化阶段(加载配置阶段) springboot 会读取 application.yaml 文件

bootstrap.yaml 文件在加载配置阶段前 就已经读取了

bootstrap.yaml 更早加载,主要用于引导配置,影响整个应用的初始化;而 application.yaml 加载较晚,负责应用的主体配置,灵活性和可覆盖性更高。

我们来举例

bootstrap配置文件在Spring Boot应用的启动过程中比application配置文件具有更高的优先级。

这意味着在应用初始化的最早阶段,Spring会先读取bootstrap文件中的配置。

由于Nacos作为配置中心,负责提供应用运行时所需的配置信息,将其地址放在bootstrap中可以确保应用在加载其他任何配置或初始化Bean之前就能建立起与Nacos的连接,从而能够及时获取到所有必需的配置。

server:
  port: 3000 # 前端默认访问端口号为3000
  servlet:
    context-path: / # 前端默认访问的根路径
spring:
  application:
    name: gateway-service  # 程序名就是服务名
  cloud:
    nacos:      
        server-addr: 174.148.4.170:8848 #注册中心

当然还有其他原因:

  • 功能隔离bootstrap配置主要用于应用程序的引导阶段,它配置的内容是用来引导Spring Boot应用上下文的创建,比如配置中心的地址、安全证书、加密解密的密钥等基础设施级别的设置。而application配置则是关于应用本身的业务逻辑和特性配置。将Nacos地址这样的基础设施配置与业务逻辑配置分离开来,有助于清晰地组织配置,同时也便于管理和维护。
  • 安全性与稳定性:将与配置中心通信的敏感信息和基础配置放在bootstrap中,可以减少这些关键信息被不当覆盖的风险,因为bootstrap的配置不容易被外部环境变量或其他配置源所覆盖。这对于生产环境尤其重要,保证了系统的稳定性和安全性。
  • 避免循环依赖:如果Nacos配置包含了应用运行所必需的参数(比如数据库连接字符串),而这些参数又存储在Nacos中,那么必须在应用启动时就正确设置Nacos的地址以获取这些参数,避免因配置加载顺序导致的潜在循环依赖问题

在来看一下3: 想象一下,你的Spring Boot应用需要从Nacos获取数据库连接字符串等关键配置来初始化数据库访问组件(如DataSource)。然而,这些数据库连接信息实际上是存储在Nacos中的。

这就形成了一个逻辑上的依赖链:应用启动 -> 连接Nacos -> 获取数据库配置 -> 初始化数据库连接。如果Nacos的地址或者连接Nacos所需的其他关键参数(如认证信息)也打算通过Nacos来管理,那么就会出现问题,因为这时应用在没有Nacos配置的情况下无法知道如何连接到Nacos以获取这些配置信息,形成了一种“鸡生蛋,蛋生鸡”的困境,即循环依赖。

总结

看到这你应该清楚了 哪些应该写在bootstrap.yaml 哪些应该写在application.yaml 里面

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • IntelliJ IDEA cmd和idea Terminal查看java版本不一致的解决方案

    IntelliJ IDEA cmd和idea Terminal查看java版本不一致的解决

    原来win10电脑上安装的是jdk8的版本,因某些原因,现在想换成jdk7的版本,修改环境变量后,在cmd中执行 [java -version]命令,显示的是7的版本,遇到这样的问题如何解决呢?下面小编给大家分享IntelliJ IDEA cmd和idea Terminal查看java版本不一致的解决方案,一起看看吧
    2023-09-09
  • Java数组的定义、初始化、及二维数组用法分析

    Java数组的定义、初始化、及二维数组用法分析

    这篇文章主要介绍了Java数组的定义、初始化、及二维数组用法,结合具体实例形式分析了java数组概念、功能、数组定义、静态数组、动态数组、二维数组等相关使用技巧,需要的朋友可以参考下
    2019-01-01
  • SpringBoot结合ProGuard实现代码混淆(最新版)

    SpringBoot结合ProGuard实现代码混淆(最新版)

    这篇文章主要介绍了SpringBoot结合ProGuard实现代码混淆(最新版),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 教你创建springcloud微服务的基础子服务的超详细过程

    教你创建springcloud微服务的基础子服务的超详细过程

    这篇文章主要介绍了创建springcloud微服务的基础子服务,主要是创建两个springboot服务,在教程中增加springcloud相关组件,本文分步骤给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 深入解析JVM之内存结构及字符串常量池(推荐)

    深入解析JVM之内存结构及字符串常量池(推荐)

    Java作为一种平台无关性的语言,其主要依靠于Java虚拟机——JVM,接下来通过本文给大家介绍JVM之内存结构及字符串常量池的相关知识,需要的朋友可以参考下
    2020-07-07
  • SpringBoot访问windows共享文件的方法

    SpringBoot访问windows共享文件的方法

    这篇文章主要介绍了SpringBoot访问windows共享文件,项目使用minio存储且不在同一台服务器上,为了优化速度决定使用windows共享功能进行文件传输,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Java线程实现的三种方式详细解析

    Java线程实现的三种方式详细解析

    这篇文章主要介绍了Java线程实现的三种方式详细解析,Java多线程实现方式主要有三种,继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程,需要的朋友可以参考下
    2023-12-12
  • 详解Java springboot 整合Shiro框架

    详解Java springboot 整合Shiro框架

    这篇文章主要为大家介绍了Java springboot 整合Shiro框架,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • Java线程池中的Future实现详解

    Java线程池中的Future实现详解

    这篇文章主要介绍了Java线程池中的Future实现详解, FutureTask是一个任务,FutureTask继承了Runnable、Callable, 通过FutureTask可以获取到任务执行的状态,任务执行完成完成后,将结构通过Future接口返回,调用者可以调用Future#get()方法获取到数据,需要的朋友可以参考下
    2023-10-10
  • Java中replace的用法实例讲解

    Java中replace的用法实例讲解

    这篇文章主要给大家介绍了关于Java中replace用法的相关资料,Java中的replace方法是用于字符串替换的方法,它可以接受两个参数,第一个参数是需要被替换的字符串,第二个参数是替换后的字符串,需要的朋友可以参考下
    2024-04-04

最新评论