4.springboot配置文件

4.springboot配置文件

resources文件夹中目录结构

  • static:保存所有的静态资源; js、css、images;
  • templates:保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面);可以使 用模板引擎(freemarker、thymeleaf);
  • application.properties:Spring Boot应用的配置文件;可以修改一些默认设置;

SpringBoot全局配置文件

application.ymlapplication.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指定的默认属性

所有支持的配置加载来源;

[参考官方文档]

posted @   Lz_蚂蚱  阅读(257)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起