首页>>后端>>SpringBoot->springboot环境配置(配置springboot的环境)

springboot环境配置(配置springboot的环境)

时间:2023-12-02 本站 点击:0

二、SpringBoot的配置--yaml

SpringBoot使用一个全局的配置文件,配置文件名是固定的;

配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;

YAML 是一个标记语言

标记语言:

以前的配置文件;大多都使用的是xxx.xml文件

YAML:以数据为中心,比json、xml等更适合做配置文件

YAML:配置例子

XML:

k:(空格)v : 表示一对键值对(空格必须有)

以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的

属性和值也是大小写敏感;

k: v :字面直接来写;

字符串默认不用加上单引号或者双引号;

"" :双引号;不会转义字符串里面的特殊字符; 特殊字符会作为本身想表示的意思

name : "zhangsan \n lisi" :输出 : zhangsan 换行 lisi

'' :单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据

name: 'zhangsan \n lisi' : 输出 ; zhangsan \n lisi

k: v : 在下一行来写对象的属性和值的关系 ;注意缩进

对象还是 k: v 的方式

行内写法:

用- 值表示数组中的一个元素

行内写法

配置文件

javaBean:

我们可以导入配置文件处理器,以后编写配置就有提示了

调整 图示:

配置文件yml还是properties他们都能获取到值;

如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value

如果说,我们专门编写一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties

@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效

SpringBoot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;

想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上

不来编写Spring的配置文件

Spring Boot推荐给容器添加组件的方式;推荐全注解的方式

1、配置类@Configuration------Spring配置文件

2、使用@Bean给容器中添加组件

我们在主配置文件编写的时候,文件名可以是application-{profile}.properties/yml

默认使用application.properties的配置

1、在配置文件中指定spring.profiles.active=dev

2、在命令行:

java -jar spring-boot-02-config.jar --spring.profiles.active=dev;

可以直接在测试的时候,配置传入命令行参数

3.虚拟机参数

-Dspring.profiles.active=dev

springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring Boot的默认配置文件

-file:./config/

-file:./

-classpath:/config/

-classpath:/

优先级由高到低,高优先级的配置会覆盖低优先级的配置

SpringBoot会从这四个位置加载主配置文件:互补配置

==我们还可以通过spring.config.location来改变默认的配置文件位置==

项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用互补配置;

java -jar spring-boot-02-config.jar --spring.config.location=G:/application.properties

==SpringBoot也可以从以下位置加载配置;优先级从高到低;高优先级的配置低优先级的配置,所有的配置会形成互补配置==

1.命令行参数

2.来自java:comp/env的JNDI属性

3.java系统属性

4.操作系统环境变量

5.RandomValuePropertySource配置的random.*属性值

==有jar包外箱jar包内进行寻找==

==优先加载带profile==

6.jar包外部的application-{profile}.properties 或 application.yml(带spring.profile)配置文件

7.jar包内部的application-{profile}.properties 或 application.yml(带spring.profile)配置文件

==再来加载不带profile==

8.jar包外部的application.properties或者application.yml(不带spring.profile)配置文件

9.jar包内部的application.properties或者application.yml(不带spring.profile)配置文件

精髓:

1》springboot启动会加载大量的自动配置类

2》我们看我们需要的功能有没有springboot默认写好的自动配置类

3》我们再来看这个自动配置类中到底配置了那些组件;(只要我们要用的组件有,我们就不需要再来配置了)

4》给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们就可以在配置文件中指定这些属性的值

Spring Boot 配置在系统环境变量中的写法

Spring Boot 通常都会用到 properties,并且可以被定义在很多地方。除了最常见的 .properties 文件,

.yml 文件:

还有 Command Line 还有环境变量等等。其中作为环境变量(也就是 OS Environment Varibles)时写法上会有讲究,如上的格式将不再可用。通常我们会忽视驼峰全用大写,并用下划线代替点,其他如短横线则保留原样,比如上述配置如果配置到环境变量,则写法如下:

SpringBoot 配置文件详解(告别XML)

快速学会和掌握 SpringBoot 的 核心配置文件的使用。

SpringBoot 提供了丰富的 外部配置 ,常见的有:

其中核心配置文件我们并不陌生,主要以Key-Value的形式进行配置,其中属性Key主要分为两种:

在 application.properties 添加配置如下:

① 添加数据源信息

在 application.propertis 添加配置如下:

① 添加认证信息,其中 socks.indentity.* 是自定义的属性前缀。

② 添加随机值,其中spring.test.* 是自定义的属性前缀。

使用方法: @ConfigurationProperties(prefix = "spring.datasource")

使用说明:提供 Setter方法 和 标记组件 Component

如何验证是否成功读取配置?答:这里可以简单做个验证,注入 MyDataSource ,使用 Debug 模式可以看到如下信息:

使用方法: @Value("spring.datasource.*")

使用说明:提供 Setter方法 和 标记组件 Component

注意事项:@Value不支持注入静态变量,可间接通过Setter注入来实现。

关于两者的简单功能对比:

显然,前者支持松绑定的特性更强大,所以在实际开发中建议使用@ConfigurationProperties来读取自定义属性。

SpringBoot 默认会加载这些路径加载核心配置文件,按优先级从高到低进行排列:具体规则详见 ConfigFileApplicationListener

如果存在多个配置文件,则严格按照优先级进行覆盖,最高者胜出:

举个简单的例子,例如再上述位置都有一个application.properties ,并且每个文件都写入了server.port=xx (xx分别是9001,9002,9003,9004),在启动成功之后,最终应用的端口为:9004。图例:

如果想修改默认的加载路径 或者 调改默认的配置文件名,我们可以借助命令行参数进行指定,例如:

YAML是JSON的一个超集,是一种可轻松定义层次结构的数据格式。

答: 因为配置文件这东西,结构化越早接触越规范越好。这里推荐阅读阮一峰老师写的 YAML语言教程 ,写的很简单明了。

引入依赖: 在POM文件引入 snakeyaml 的依赖。

使用说明: 直接在类路径添加 application.yml 即可。

例如下面这两段配置是完全等价的:

① 在 application.yml 配置数据源:

② 在 application.properties 配置数据源:

在项目的实际开发中,我们往往需要根据不同的环境来加载不同的配置文件。例如生产环境,测试环境和开发环境等。此时,我们可以借助 Profiles 来指定加载哪些配置文件。例如:

温馨提示:如果spring.profiles.active指定了多个配置文件,则按顺序加载,其中最后的优先级最高,也就是最后的会覆盖前者。

使用方法:

使用Maven插件打包好项目,然后在当前路径,执行DOS命令: java -jar demo.jar --server.port=8081 ,在控制台可看到应用端口变成了8081。

实现原理:

默认情况下,SpringBoot会将这些命令行参数转化成一个 Property ,并将其添加到 Environment 上下文。

温馨提示:

由于命令行参数优先级非常之高,基本高于所有常见的外部配置,所以使用的时候要谨慎。详见 PropertySource 执行顺序 。

关闭方法:

如果想禁用命令行属性,可以设置如下操作:springApplication.setAddCommandLineProperties(false)

Spring Boot 配置的优先级

本文主要参考 Externalized Configuration

为了能让应用在不同的环境下运行,Spring Boot允许自定义配置文件,如properties文件、yaml文件、系统环境变量参数、命令行参数。配置文件的覆盖优先级如下

Developer Tools 提供了一些开发帮助工具,在build.gradle添加依赖后启用。

Spring Boot会读取在计算机用户的home目录下的 .spring-boot-devtools.properties 文件里的配置参数到该计算级的所有Spring Boot应用中作为顶层配置,如Linux环境下root用户下 ~/.spring-boot-devtools.properties 文件。开发过程中,可以将一些个人参数记录在这个配置文件中,例如ip地址,机器uuid,datasource参数等。在该配置文件中的定义的配置环境并不会影响到应用配置的读取,官方原话是:

但要注意,该配置优先级最高,设置的时候需要做好记录否则会出现"原因不明的bug",不过应该很少人会用到这个功能。分析下源码,就是加了一个配置切面,并把其设置为顶层配置:

在测试的时候,可能会使用另一套测试专用的配置,该套配置的优先级高于系统环境变量、java系统参数、程序内部参数, @TestPropertySource 注解就是用来指定这一类配置的。该注解一共有5个参数可以设置:

如果使用注解的时候没有任何参数,那么会从标注了注解的测试类的包中尝试读取配置文件,例如测试类 com.spring.test.DemoTest ,那么相应的默认配置文件为 com.spring.test.DemoTest.properties ,如果没有找到默认的配置文件则抛出非法状态异常。

AbstractTestContextBootstrapper 在初始化上下文的时候会调用一个读取、合并配置的方法 buildMergedContextConfiguration ,该方法通过工具类 TestPropertySourceUtils 读取类的注解信息。 TestPropertySourceUtils 从类的注解解析配置信息后返回一个可合并的配置源。

@SpringBootTest 的value\properties属性用于注入一些自定义的注解,语法要求和 @TestPropertySource 的properties一样,这里就不详细展开了。

用命令行方式启动Spring Boot应用程序的时候,可以注入一些配置参数,参数的格式是 --key=name 。举个简单的例子,程序直接输出一个参数,然后打成jar包后运行。

运行:

java -jar .\springbootconfiguraiton.jar --cl.name="Spring Boot Arguments"

从输出的结果中可以看到可以读取到命令行中的配置。

可以在环境变量中定义一个key为SPRING_APPLICATION_JSON的参数,值为json字符串,Spring Boot会解析该json字符串作为参数注入到系统中。SPRING_APPLICATION_JSON可以定义在环境变量、系统配置中,命令行也是可以的,例如命令行参数中用到的demo,执行以下的命令也应该能得到相同的参数结果。

java -jar .\springbootconfiguraiton.jar SPRING_APPLICATION_JSON='{"cl":{"name"="Spring Boot Arguments"}}'

结果输出是undefined,不知道原因,这个配置方式用的应该也很少,放弃研究。。。

优先级是 ServletConfig ServletContext ,可以在application.yml中设置:

随机数配置大多用于测试,支持的类型如下:

其中long\int可以限制数据范围,[]是闭区间,()是开区间。

这个应该是我们用的最多的。首先说优先级,文件可以放在以下4个位置,相同文件从上到下覆盖。外部指的是启动应用程序的目录,例如gradle用application插件打包后,运行的脚本目录就是 ./ :

文件的命名为 application-[当前激活的环境名].[yml/properties] ,当前激活的配置可以用 spring.profile.active=[当前激活的环境名] 定义,多个环境名用逗号分隔,未设置时用 default 标识。关于如果修改默认的加载路径和文件名,后面会继续讨论。

Spring Boot系统启动时默认会读取的配置文件,支持properties\yml格式。也就是说,会先加载 application.properties ,根据 spring.profile.active 的设置加载相应的 application-XX.properties 配置,然后按优先级合并配置文件。

不同文件目录下application.properties的优先级和 自定义配置文件 的顺序是一样的。

类似 @TestPropertySource注解 ,在项目中可以方便的注入自定义的配置文件,注解一共有5个参数:

Spring Boot - 多环境配置

在项目开发时,我们经常需要在不同的运行环境中进行切换,典型的场景包括: 开发环境 dev , 测试环境 test 以及 发布环境 prod 。

不同的环境可能会对应不同的配置内容,如果手动更改运行环境配置,会显得非常繁琐与低效。

因此,Spring Boot 提供了一套机制可以很容易地让我们进行多环境配置。

假设现在我们需要往返于两个运行环境: 开发环境 dev 和 测试环境 test 。

Spring Boot 提供了一套多环境配置机制,称为: Profile-specific Properties ,可以将其理解为 环境相关配置文件 。

Profile-specific Properties 多环境配置的具体步骤如下所示:

以上,我们就完成了多环境配置,运行程序,结果如下:

可以看到,成功运行在开发环境 dev 中,并且相应的配置选项也生效了。

注 :如果没有指定具体环境配置文件,那么 Spring Boot 默认加载 application-default.properties 配置文件,相当于 application.yml 默认配置选项:

除了上述最为推荐的方式进行多环境配置外,Spring Boot 还提供了许多其他方式进行配置,下面简单介绍几种:

注 :当开启了多个运行环境时,最终的配置由最后一个环境决定。

比如, spring.profiles.active 属性加载晚于 SpringApplication 相关 API 设置,因此其指定的环境配置文件中的配置生效。


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