SpringBoot的配置

主要关于配置文件,加载顺序和配置原理


一、配置文件

1、配置文件

Spring Boot使用两种全局配置文件
application.properties
application.yml
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层给我们自动配置好了

2、yml语法

(1)基本语法

k:(空格)v
以空格缩进的量来表名层级关系
例如:

server:
  port: 8081

(2)值的写法

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

k: v
字符串默认不加单引号或者双引号
特殊意义可以加
“ ”:双引号,不会转义字符串里面的特殊字符

例如:
name: “张三 \n lisi”–》输出:张三 \n lisi

’ ‘:单引号,会转义特殊字符
例如:
“张三 \n lisi”–》输出:张三 换行 lisi

对象,Map(键值对)

k: v: 在下一行写属性或者值,注意缩进

frieng:
  lastname: zhangsan
  age:20

行内写法:

friend: {lastName: zhangsan,age: 18}
数组(List、set)

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

perm:
  - cat
  - dog
  - pig

行内写法:

perm: [cat,dog,pig]

例如:

测试

导入依赖

      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

这是一个关于@ConfigurationProperties(prefix = “person”)依赖

编写实体类

package com.uestc.wpp.bean;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.awt.*;
import java.util.LinkedList;
import java.util.Map;
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastName;
    private Integer age;
    private Boolean sex;

    private Map<String,Object> maps;
    private LinkedList<Object> lists;
    private Dog dog;

    public void setLists(LinkedList<Object> lists) {
        this.lists = lists;
    }

    @Override
    public String toString() {
        return "Person{" +
                "lastName='" + lastName + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Integer getAge() {
        return age;
    }

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

    public Boolean getSex() {
        return sex;
    }

    public void setSex(Boolean sex) {
        this.sex = sex;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }



    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }
}


package com.uestc.wpp.bean;

public class Dog {
    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;
    }
}

配置属性

server:
  port: 8081
person:
  lastName: zhangsan
  age: 18
  sex: true
  maps: {k1: v1,k2: v2}
  lists:
    - lisi
    - wangwu
  dog:
    name: 小狗
    age: 2

测试

package com.uestc.wpp;

import com.uestc.wpp.bean.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class WppApplicationTests {
    @Autowired
    Person person;
    @Test
    void contextLoads() {
        System.out.println(person);
    }

}

测试结果

在这里插入图片描述

3、properties配置文件

person.last-name=李四
person.maps.k2=v2
person.maps.k3=v3
person.age=18
person.dog.age=18
person.dog.name=xiaobai
person.sex=true

输出为
在这里插入图片描述
会发现中文有乱码,需要修改设置
setting-FileCoding
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020111910412479.png?x-oss-process=image/watermark,ty在这里插入图片描述
解决
在这里插入图片描述

4、利用@Value注解配置

package com.uestc.wpp.bean;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.stereotype.Component;

import java.util.LinkedList;
import java.util.Map;
@Component
 public class Person {
    @Value("${person.lastName}")
    private String lastName;
    @Value("#{11*2}")
    private Integer age;
    @Value("true")
    private Boolean sex;

    private Map<String,Object> maps;
    private LinkedList<Object> lists;
    private Dog dog;

    public void setLists(LinkedList<Object> lists) {
        this.lists = lists;
    }

    @Override
    public String toString() {
        return "Person{" +
                "lastName='" + lastName + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Integer getAge() {
        return age;
    }

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

    public Boolean getSex() {
        return sex;
    }

    public void setSex(Boolean sex) {
        this.sex = sex;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }



    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }
}

与@ConfiguratinoProperties的比较

@ConfigurationProperties@Value
功能上批量注入文件中的属性一个个指定
松散绑定支持不支持
SpEL不支持支持
JSR303数据校验支持不支持
复杂类型数据注入支持不支持

SpEL: @Value("#{11*2}")
数据校验:例如@Email注解,用来校验输入数据是不是邮箱

5、@PropertySource与@ImportResource

(1)@PropertySource

@PropertySource:加载指定的配置文件,如果把所有的配置都放到application文件中就很多,所以利用这个注解作为外部引入
建立一个person.properties文件,配置内容为

person.last-name=王五
person.maps.k2=v2
person.maps.k3=v3
person.age=18
person.dog.age=18
person.dog.name=xiaobai
person.sex=true
person.lists=l1

代码如下

package com.uestc.wpp.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

import java.util.LinkedList;
import java.util.Map;
@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
@Data
@AllArgsConstructor
@NoArgsConstructor
 public class Person {
    private String lastName;
    private Integer age;
    private Boolean sex;

    private Map<String,Object> maps;
    private LinkedList<Object> lists;
    private Dog dog;

    public void setLists(LinkedList<Object> lists) {
        this.lists = lists;
    }

    @Override
    public String toString() {
        return "Person{" +
                "lastName='" + lastName + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }
}

输出内容为:
在这里插入图片描述

(2)@ImportSource

@ImportSource:导入Spring的配置文件,让配置文件里面的内容生效
在Resources文件夹下建立一个bean.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="helloService" class="com.uestc.wpp.service.HelloService"></bean>
</beans>

注意要建立一个类com.uestc.wpp.service.HelloService
测试:

package com.uestc.wpp;

import com.uestc.wpp.bean.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ImportResource;

@ImportResource(locations = {"classpath:bean.xml"})
@SpringBootTest
class WppApplicationTests {
    @Autowired
    Person person;
    @Autowired
    ApplicationContext ioc;
    @Test
    void contextLoads() {
        System.out.println(ioc.containsBean("helloService"));
    }


}

输出为:true表明配置成功

6、@Configuration

@Configuration指明当前类是一个配置类;就是来替代之前的Spring配置文件,在配置文件中用标签添加组件
具体配置代码:


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyAppConfig {

    @Bean
    public void helloWorld(){
     System.out.println("helloWorld添加组件成功");
    }
}

在这里插入图片描述

这个方法可以将返回值添加到容器中,容器中的组件默认的id就是方法名。

7、Profile多环境

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

(1)多Profile文件

我们在主配置文件编写的时候,文件名可以是application-{profile}.properties
默认使用application.properties
例如分别建立开发和生产环境的Profile,分别为application-dev.properties,application-prod.properties
application-dev.properties设置为:

server.port=8082

application-prod.properties设置为:

server.port=80

(2)激活Profile

默认启动的是application.properties,如果要激活其他Profile,如下所示

①properties指定配置

在指定配置文件中激活spring.profiles.active=dev
这时候port为8082,如下图所示
在这里插入图片描述

②yml文档块激活

在这里插入图片描述
过时了,不知道最新的是什么

③命令行式

两种:命令行式
在这里插入图片描述
或者虚拟机式
在这里插入图片描述

④打包方式(待补充)

打包之后利用cmd命令运行

8、配置文件加载位置

根据加载优先级从高到低罗列:
file:/config/
file:./
classpath:/config/
classpath:/

其中file根目录,与src目录同级别,calsspath是Resources文件
SpringBoot会从这四个位置全部加载配置文件,他们之间会进行互补配置,对于重复的配置会选择高优先级的配置。

9、外部配置的加载顺序

SpringBoot也可以从以下位置进行加载配置;优先级从高到低;高优先级的配置覆盖低优先级的配置,所有配置会形成互补配置
1,命令行配置
2,来自java:com/env的JNDI属性
3,java系统属性
4,操作系统环境变量
5,RandomValuePropertyResource配置的random.*配置
6,jar包外的application-{profiles}.propertie或者application.yml(带Spring.profile)配置文件
7,jar包内部的application-{profiles}.propertie或者application.yml(带Spring.profile)配置文件
8,jar包外部的application.propertie或者application.yml(不带Spring.profile)配置文件
9,jar包内部的application.propertie或者application.yml(不带Spring.profile)配置文件
10,@Configuration注解类上的@PropertySource
11,通过SpringAPlication.setDefaultProperties指定的默认属性

10、配置原理

SpringBoot自动配置原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值