Spring Boot-配置文件

一、配置文件

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

  • application.properties
  • application.yml
  • application.yaml

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

YAML

YAML(YAML Ain’t Markup Language)

​ YAML A Markup Language:是一个标记语言

​ YAML isn’t Markup Language:不是一个标记语言;

标记语言:

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

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

二、YAML语法

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

  • 次等级的前面是空格,不能使用制表符(tab)

  • 冒号之后如果有值,那么冒号和值之间至少有一个空格,不能紧贴着

  • 属性和值大小写敏感;

server:
  port: 8081
  path: /hello

字面量:普通的值(数字,字符串,布尔)

k: v
字符串默认不用加上单引号或者双引号;
"":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思

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

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

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

对象、Map(属性和值):

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

person:
  name: 张三
  gender:age: 22

2.行内写法

person: {name: 张三,gender:,age: 22}

数组(List、Set)

fruits: 
  - 苹果
  - 桃子
  - 香蕉

2.行内写法

fruits: [苹果,桃子,香蕉]

三、配置文件值注入

JavaBean:

public class Pet {

    private String name;
    private Integer age;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Pets{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

}

配置文件:

person:
  name: 张三
  gender:age: 36
  boss: true
  birth: 1982/10/1
  maps: {k1: v1,k2: v2}
  lists:
    - apple
    - peach
    - banana
  pet:
    name: 小狗
    age: 12

测试类

package cn.clboy.helloworldquickstart;

import cn.clboy.helloworldquickstart.model.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class HelloworldquickstartApplicationTests {

    @Autowired
    private Person person;

    @Test
    void contextLoads() {
        System.out.println(person);
    }

}

properties
上面yaml对应的properties配置文件写法

person.name=李四
person.age=34
person.birth=1986/09/12
person.boss=true
person.gender=女
person.lists=cat,dog,pig
person.maps.k1=v1
person.maps.k2=v2
person.pet.name="小黑"
person.pet.age=10

测试,发现中文会乱码,而且char类型还会抛出Failed to bind properties under ‘person.gender’ to java.lang.Character异常

中文乱码解决方法

在设置中找到File Encodings,将配置文件字符集改为UTF-8,并勾选:Transparent native-to-ascii conversion
在这里插入图片描述
yaml和properties配置文件同时存在,properties配置文件的内容会覆盖yaml配置文件的内容

配置文件值注入两种方式对比

在这里插入图片描述

松散绑定

例如Person中有lastName属性,在配置文件中可以写成

lastNamelastnamelast-namelast_name等等

SpEL

## properties配置文件
persion.age=#{2019-1986+1}

properties配置文件
persion.age=#{2019-1986+1}

Person类
#--------------------使用@ConfigurationProperties注解,会抛出异常--------------------
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private Integer age;


#--------------------使用@value注解 OK--------------------
@Component
public class Person {
    @Value("${person.age}")
    private Integer age;

JSR303数据校验

@ConfigurationProperties支持校验,如果校验不通过,会抛出异常
在这里插入图片描述
@value注解不支持数据校验
在这里插入图片描述

复杂类型封装

@value注解无法注入map等对象的复杂类型,但list、数组可以
在这里插入图片描述

@PropertySource

@PropertySource注解的作用是加载指定的配置文件,值可以是数组,也就是可以加载多个配置文件

springboot默认加载的配置文件名是application,如果配置文件名不是这个是不会被容器加载的,所以这里Person并没有被注入任何属性值在这里插入图片描述
使用@PropertySource({"classpath:person.properties"})指定加载person.properties配置文件在这里插入图片描述
使用这个注解加载配置文件就需要配置类使用@component等注解而不是等待@EnableConfigurationProperties激活,而且不支持yaml,只能是properties

@ImportResource

@ImportResource注解用于导入Spring的配置文件,让配置文件里面的内容生效;(就是以前写的springmvc.xml、applicationContext.xml)

Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;在这里插入图片描述
想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上在这里插入图片描述
注意!这个注解是放在主入口函数的类上,而不是测试类上

@Configuration

SpringBoot推荐给容器中添加组件的方式;推荐使用全注解的方式

配置类@Configuration —equals—> Spring配置文件

@Bean

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

package cn.clboy.helloworldquickstart.config;

import cn.clboy.helloworldquickstart.model.Pet;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 *
 * Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件
 */


@Configuration
public class BeanConfiguration {

    /**
     *相当于在配置文件中用<bean><bean/>标签添加组件
     */
    @Bean
    public Pet myPet() {
        Pet pet = new Pet();
        pet.setName("嘟嘟");
        pet.setAge(3);
        return pet;
    }
}

四、配置文件占位符

随机

${random.value}
${random.int}
${random.long}
${random.int(10)}
${random.int[1024,65536]}

在这里插入图片描述
可以引用在配置文件中配置的其他属性的值,如果使用一个没有在配置文件中的属性,则会原样输出
在这里插入图片描述
可以使用:指定默认值在这里插入图片描述

五、Profile

Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境

多profile文件形式

文件名格式:application-{profile}.properties/yml,例如:

  • application-dev.properties
  • application-prod.properties在这里插入图片描述
    程序启动时会默认加载application.properties,启动的端口就是8080

可以在主配置文件中指定激活哪个配置文件在这里插入图片描述

yml支持多文档块方式

每个文档块使用---分割

server:
  port: 8080
spring:
  profiles:
    active: prod
---
server:
  port: 8081
spring:
  profiles: dev
---
server:
  port: 8082
spring:
  profiles: prod

在这里插入图片描述

激活指定profile的三种方式

1.在配置文件中指定 spring.profiles.active=dev(如上)

2.项目打包后在命令行启动

java -jar xxx.jar --spring.profiles.active=dev;

在这里插入图片描述
3.虚拟机参数

-Dspring.profiles.active=dev

在这里插入图片描述

六、配置文件加载位置

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

file: ./config/

​ file: ./

​ classpath: /config/

​ classpath: / -->first load ↑

优先级由高到底,高优先级的配置会覆盖低优先级的配置(优先级低的先加载);
SpringBoot会从这四个位置全部加载主配置文件;互补配置
在这里插入图片描述
这里项目根路径下的配置文件maven编译时不会打包过去,需要修改pom

<resources>
    <resource>
        <directory>.</directory>
        <filtering>true</filtering>
        <includes>
            <include>**/*.properties</include>
            <include>**/*.yaml</include>
        </includes>
    </resource>
</resources>

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

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

java -jar xxx.jar --spring.config.location=/home/cloudlandboy/application.yaml

七、外部配置加载顺序

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

1.命令行参数

所有的配置都可以在命令行上进行指定

java -jar xxx.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.propertiesapplication.yml(不带spring.profile)配置文件

7.jar包内部的application.propertiesapplication.yml(不带spring.profile)配置文件

优先加载带profile

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

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

10.@Configuration注解类上的@PropertySource

11.通过SpringApplication.setDefaultProperties指定的默认属性

所有支持的配置加载来源:
参考官方文档
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值