4.springboot配置文件
4.springboot配置文件
resources文件夹中目录结构
- static:保存所有的静态资源; js、css、images;
- templates:保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面);可以使 用模板引擎(freemarker、thymeleaf);
- application.properties:Spring Boot应用的配置文件;可以修改一些默认设置;
SpringBoot全局配置文件
application.yml
或 application.properties
配置文件名称是固定的。SpringBoot会自动加载这个文件,无需我们指定加载的文件的名称。
配置文件的作用 :修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了;
修改端口号
# 修改端口 server: port: 8081
YAML(YAML Ain't Markup Language)
标记语言,以数据为中心
1、基本语法 k:(空格)v:表示一对键值对(空格必须有); 以 空格 的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的 属性和值也是大小写敏感; 2、值的写法 字面量:普通的值(数字,字符串,布尔) k: v:字面直接来写; 字符串默认不用加上单引号或者双引号; "":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思 name: "zhangsan \n lisi":输出;zhangsan 换行 lisi '':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据 name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi # 对象、Map(属性和值)(键值对): k: v:在下一行来写对象的属性和值的关系;注意缩进 对象还是k: v的方式 friends: lastName: zhangsan age: 20 行内写法: friends: {lastName: zhangsan,age: 18} # 数组(List、Set): 用- 值表示数组中的一个元素 pets: - cat - dog - pig 行内写法: pets: [cat,dog,pig]
配置文件属性注入
属性注入意义:
对实体类、配置类等,需要对类的内容进行赋值等操作就可以使用配置文件进行属性注入,省去new对象然后进行赋值等操作。
1.定义属性注入类
在类上通过@ConfigurationProperties (prefix = "person")注解声明当前类为属性读取类
prefix="person"读取配置文件中,前缀为person的值。
在类上定义各个属性,名称必须与属性文件中person.后面部分一致
内部通过反射生成setDriverClassName方法,给当前类的对象进行赋值,所以属性名称很重要
要在类上声明这些属性在属性文件中的共同的前缀,并提供getter和setter方法
使用@component注解修饰,只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能
person.class实体类
package com.myspringboot.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; /* @ConfigurationProperties作用: 将配置文件中配置的每一个属性的值,映射到这个组件中; 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定 参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能,所以要使用@component注解修饰 */ @Component // 一定要将类注入到spring容器中,否则不能使用此方式属性注入 @ConfigurationProperties(prefix = "person") @Data @NoArgsConstructor @AllArgsConstructor public class Person { private String name; private Integer age; private String gender; private Dog dog; private List list; private Map map; }
application.yaml配置文件
person: name: huahua age: 18 gender: woman dog: name: peiqi age: 3 list: - code - girl - music map: {k1: v1,k2: v2}
注意:若配置文件中属性名与组件中属性名不一致,不能进行映射值,输出的属性值为空
我们可以导入配置文件处理器,以后编写配置就有提示了
<!--导入配置文件处理器,配置文件进行绑定就会有提示--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
properties配置文件,idea中默认utf-8可能会乱码
2.注册使用属性类
默认情况下,属性读取类JdbcProperties是 不会被加入Spring的容器的,需要下面两种方式来激活:
Springboot版本2.2以后不用注册
@Value获取值和@ConfigurationProperties获取值比较
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
松散绑定:这个什么意思呢? 比如我的yml中写的last-name,这个和lastName是一样的, - 后面跟着的字母默认是大写的。这就是松散绑定
配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
配置文件占位符
1.随机数
${random.value}、${random.int}、${random.long} ${random.int(10)}、${random.int[1024,65536]}
2.获取其他配置的值,如果没有可以使用冒号 ' : ' 指定默认值
person.last-name=张三${random.uuid} person.age=${random.int} person.birth=2017/12/15 person.boss=false person.maps.k1=v1 person.maps.k2=14 person.lists=a,b,c person.dog.name=${person.hello:hello}_dog // 获取person.hello的值,冒号后面是指定的默认值,若找不到就使用默认值 person.dog.age=15
多环境切换
profile
是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境;
例如,需要测试环境、开发环境等。
1.多Profile文件
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties
, 用来指定多个环境版本;
例如:application-test.properties
代表测试环境配置 application-dev.properties
代表开发环境配置
但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件;
我们需要通过一个配置来选择需要激活的环境;
激活指定profile:
方式一:在application.properties
配置文件中指定
spring.profiles.active=dev
方式二:命令行
# 可以直接在测试的时候,配置传入命令行参数 java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
方式三:虚拟机参数
-Dspring.profiles.active=dev
2.yml支持多文档块方式
yml文件中使用三个横杠 ' - - - ' 表示文档块
#比如在配置文件中指定使用dev环境,我们可以通过设置不同的端口号进行测试; server: port: 8081 #选择要激活那个环境块 spring: profiles: active: dev # 激活生产环境,我们启动SpringBoot,就可以看到已经切换到dev下的配置了; server: context-path: /boot02 # 指定项目的访问路径 --- server: port: 8083 spring: profiles: dev #配置环境的名称 --- server: port: 8084 spring: profiles: prod #配置环境的名称
注意:如果yml和properties同时都配置了端口,并且没有激活其他环境 , 默认会使用properties配置文件的!
指定项目的访问路径后,访问:
配置文件加载位置
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
优先级1:项目路径下的config文件夹配置文件 优先级2:项目路径下配置文件 优先级3:资源路径下的config文件夹配置文件 优先级4:资源路径下配置文件
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载主配置文件;互补配置;
互补配置:将从高到低优先级的所有配置加起来,形成总配置
还可以通过spring.config.location来改变默认的配置文件位置:
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置; 例如: java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties
外部配置加载顺序
SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置
1.命令行参数
所有的配置都可以在命令行上进行指定
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
多个配置用空格分开; --配置项=值
2.来自java:comp/env的JNDI属性
3.Java系统属性(System.getProperties())
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)配置文件
10.@Configuration注解类上的@PropertySource
11.通过SpringApplication.setDefaultProperties指定的默认属性
所有支持的配置加载来源;
[参考官方文档]
本文来自博客园,作者:Lz_蚂蚱,转载请注明原文链接:https://www.cnblogs.com/leizia/p/16686844.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步