Spring Boot配置文件

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这个配置文件,只需要让其中一个配置文件起作用就可以了。配置好后运行主函数。
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

控制台打印输出

在这里插入图片描述

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。配置也就成功了

在这里插入图片描述

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能够显示数据则说明配置成功

在这里插入图片描述

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,欢迎各位进行学习讨论
欢迎关注熊熊出没ING公众号,不定时跟新Java、python、信息安全等相关知识哦。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值