欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Boot配置文件

程序员文章站 2022-05-03 15:54:29
...

1. Spring Boot配置文件

Spring Boot提供了两种常用的配置文件,分别是properties文件和yml文件。配置文件的作用是修改Spring Boot自动配置的默认值。

SpringBoot全局配置文件,配置文件名是固定的;

•application.properties

•application.yml

在SpringBoot中,这两种配置文件各有各的优点,各有各的缺点。

application.properties:属性访问结构,层级深浅对它来说是一样的,而且相较于application.yml类型的文件比较好配置,但缺点也很明显–要重复写很多遍父级属性;

application.yml:利用空格决定层次结构,层级少的时候使用比较方便,层级深的时候就比较麻烦了,需要严格控制空格的使用。

相对properties文件,yml更加年轻,yaml通过空格来确定层次关系,采用这种方式,最大的优点就是文件结构很清晰。但同时也要注意空格的使用,空格的多于或不足会导致层级关系出现混乱。

2. YAML简介和语法

2.1 yaml简介和常用配置

YAML和XML一样,也是一种可标记语言,和XML比较,yml配置起来更加方便快捷。yaml(yml)以数据为中心,比json、xml等更适合做配置文件。

下面是一个yml的常用配置

server:
  port: 8080
  servlet:
    context-path: /

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: root

mybatis:
  mapper-locations: classpath:mapping/*.xml
  type-aliases-package: com.chtw.pojo

2.2 yaml语法

2.2.1 基本语法

键值对的形式(在值和键中间需要一个空格,并且不可以少)

key:(此处需要一个空格)value

以空格来决定层次结构,保持左边对齐的就是同一层级。

下面配置服务器端口为80,默认8080,访问路径/hello,需要注意的是属性和值对大小写敏感;

server:
    port: 80
    path: /hello

前一章中创建了springboot项目,给他添加一个配置文件application.yml,添加以上类容,删除原来的配置文件application.properties这个配置文件,只需要让其中一个配置文件起作用就可以了。配置好后运行主函数。
Spring Boot配置文件
Spring Boot配置文件

2.2.2 值的写法

数字,字符串,布尔的写入:

直接写入,默认不用加双引号或单引号。如果加上了双引号,则不会转义字符串里面的特殊字符;如果加上单引号,会转义特殊字符。

例子如下:

server:
    port: 80
    path: /hello

对象、Map(键值对)的写入:

people:
    name: wangming
    sex:info: "I am a Java programmer,\n but I also like to use python."
    infon: 'I am a Java programmer,\n but I also like to use python.'
    maps: {k1: 59,k2: 2}

或者

server:
    port: 80
    path: /hello
people:
    name: wangming
    sex:info: "I am a Java programmer,\n but I also like to use python."
    infon: 'I am a Java programmer,\n but I also like to use python.'
    maps:
       k1: 59
       k2: 2

2.2.3 数组(List、Set)的写法:

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

list:
      --set:
      - wu
      - li

3. 配置文件值注入

3.1 配置文件值的注入

新建一个people类

package com.chtw.entity;

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

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author CHTW
 * 将配置文件中配置的每一个属性的值,映射到这个组件中
 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
 * 除了@ConfigurationProperties注入之外还有一种@Value注入
 * prefix = "people":选择映射位置
 * @date 2019-08-24-8:18
 */
@Component
@ConfigurationProperties(prefix = "people")
public class People {
    private String name;
    private int age;
    private String info;
    private String infon;
    private String sex;
    private Map<String ,String> maps;
    private List list;
    private Set set;

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

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

    public List getList() {
        return list;
    }

    public void setList(List list) {
        this.list = list;
    }

    public Set getSet() {
        return set;
    }

    public void setSet(Set set) {
        this.set = set;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    public String getInfon() {
        return infon;
    }

    public void setInfon(String infon) {
        this.infon = infon;
    }

    public String getSex() {
        return sex;
    }

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

    @Override
    public String toString() {
        return "People{" +
                "name='" + name +
                ", age=" + age +
                ", info='" + info +
                ", infon='" + infon +
                ", sex='" + sex +
                ", maps=" + maps +
                ", list=" + list +
                ", set=" + set +
                '}';
    }
}

application.yml

server:
    port: 80
    path: /hello
people:
    name: wangming
    sex:info: "I am a Java programmer,\n but I also like to use python."
    infon: 'I am a Java programmer,\n but I also like to use python.'
    maps:
       k1: 59
       k2: 2
    list:
          --set:
          - wu
          - li

修改一下controller

package com.chtw.controller;

import com.chtw.entity.People;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author CHTW
 * @date 2019-08-23-17:43
 */
/*
 * @Controller
 * @ResponseBody
 */
@RestController
public class HelloController {

    //自动注入
    @Autowired
    private People people;

    @RequestMapping("/hello")
    public String hello(){
        System.out.println(people.toString());
        return "Hello World! Welcome to Spring-Boot"+people.toString();
    }
}

运行主函数,浏览器访问:localhost:80/hello

Spring Boot配置文件

控制台打印输出

Spring Boot配置文件

3.3.1 @Value和@ConfigurationProperties的区别

@Value写在变量前面,单一配置,是spring的底层注解,支持SpEL,不支持JSR303数据校验,不支持复制类型的封装,当我们在某一项业务逻辑中需要获取某一个属性的值的时候,可以使用@Value。

/*
*	@Component将people加入到当前容器中,在controller那边才能自动注入
*	@ConfigurationProperties方法
*/
@Component
@ConfigurationProperties(prefix = "people")
public class People {
    private String name;
    private int age;
    private String info;
	//set、get方法省略,自行补充
}
@Component
public class People {
    @Value("${people.name}")
    private String name;
    @Value("${people.age}")
    private int age;
    @Value("${people.info}")
    //set、get方法省略,自行补充
}

@ConfigurationProperties写在类前面,指定注入位置,批量注入,不支持SpEL,支持JSR303数据校验,支持复制类型的封装,如果我们有一个JavaBean来对配置文件映射的时候,使用@ConfigurationProperties。

另外,我们可以导入一个依赖,这个依赖只要我们将JavaBean进行绑定后,可以在我们写yml的时候给我们提示。

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

3.2 加载指定的配置文件@PropertySource

@PropertySource:用于加载指定的配置文件;当我们全局配置文件里面的类容过多的时候,不方便操作和修改维护等;所以我们可以自定义一些配置文件,但是springboot默认读入全局配置文件,不会读取我们自定义的配置文件,要想springboot能读取我们定义的配置文件,需要我们进行配置。@PropertySource就是其中一种方法。

下面是一个例子:将原来的application.yml文件中有关people的类容删除,只留下server相关配置。然后新建一个people.properties

people.name=lisi
people.age=21
people.info=hello world!
people.infon=hello word!
people.sex=男
people.maps.k1=56
people.maps.k2=5
people.list=1,2,3
people.set=1,2

在peoplel类上加一个注解

package com.chtw.entity;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
import java.util.Set;

@PropertySource(value = {"classpath:people.properties"})
@Component
@ConfigurationProperties(prefix = "people")
public class People {
   // @Value("${people.name}")
    private String name;
    //@Value("${people.age}")
    private int age;
    //@Value("${people.info}")
    private String info;
    private String infon;
    private String sex;
    private Map<String ,String> maps;
    private List list;
    private Set set;

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

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

    public List getList() {
        return list;
    }

    public void setList(List list) {
        this.list = list;
    }

    public Set getSet() {
        return set;
    }

    public void setSet(Set set) {
        this.set = set;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    public String getInfon() {
        return infon;
    }

    public void setInfon(String infon) {
        this.infon = infon;
    }

    public String getSex() {
        return sex;
    }

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

    @Override
    public String toString() {
        return "People{" +
                "name='" + name +
                ", age=" + age +
                ", info='" + info +
                ", infon='" + infon +
                ", sex='" + sex +
                ", maps=" + maps +
                ", list=" + list +
                ", set=" + set +
                '}';
    }
}

3.3 导入Spring的配置文件@ImportResource

**@ImportResource:**导入Spring的配置文件,让配置文件里面的内容生效;Spring Boot里面没有Spring的配置文件,当我们需要用到spring的一些配置时,就需要导入spring配置文件。

@ImportResource(locations = {"classpath:XXX.xml"})

3.4 @Configuration和@Bean

@Configuration和@Bean这两个注解嫩能够替代方法2.5中的XXX.xml文件,通过写Java代码的方式实现spring配置文件的导入。

/**
 * @Configuration:说明这是配置类;用来来替代的Spring的xml文件
 */
@Configuration
public class Config {

    //组件默认的id就是方法名
    @Bean
    public Hello hello(){
        return new Hello();
    }
}

创建一个Hello类;

package com.chtw.config;

/**
 * @author CHTW
 * @date 2019-08-24-14:30
 */
public class Hello {
    public void sys(){
        System.out.println("成功了");
    }
}

在test包下面的java文件夹下的SpringBoot02ApplicationTests类中添加一个单元测试方法:

package com.chtw.springboot02;

import com.chtw.config.Hello;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot02ApplicationTests {


	@Autowired
	ApplicationContext context;

	@Test
	public void contextLoads() {
	}

	@Test
	public void sys() {
        //获取一个Javabean
		Hello hello = context.getBean(Hello.class);
		hello.sys();
	}
}

单步运行sys方法,控制台打印出”成功了“则说明容器中包含Hello这个bean。配置也就成功了

Spring Boot配置文件

4. Profile多环境支持

在实际开发项目中,一般情况下最少有三种环境:开发、测试、正式,各个环境之间的参数也各不相同,为了方便我们快速切换环境,spring提供了profile多环境支持的功能。

4.1 application-{profile}.properties.yml

在编写全局配置文件的时候多变写几个,通过命名不同来区分不同的环境。默认使用application.properties的配置;通常由以下几种:

application-dev.properties/yml

server:
    port: 8082

application-prod.properties/yml

server:
    port: 8083

application.properties.yml中配置spring.profiles.active来选择**哪一个环境

server:
    port: 8081
spring:
    profiles:
      active: dev  #启用dev环境

此时访问:localhost:8082/hello能够显示数据则说明配置成功

Spring Boot配置文件

4.2 yml多文档块

只需要一个全局配置文件application.yml,不再需要其他的配置文件,一组”—“中是一个文档块

server:
  port: 8081
spring:
  profiles:
    active: dev #启用环境的名称
---
server:
  port: 8082
spring:
  profiles: dev #指定环境名称
---
server:
  port: 8083
spring:
  profiles: prod  

4.3 **指定profile

当项目已经完成并且打包好了过后,如果我们需要临时修改某修参数的时候,修改完成又需要重新打包发布,比较麻烦;这个时候我们也可以采取在命令行添加某些命令去临时改变。

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

启动后访问:localhost:8082/hello,打印结果说明改变成功。

本人联系方式2329095893,欢迎各位进行学习讨论