吐血整理:SpringBoot配置文件详解

法律不能使人人平等,但在法律面前人人平等

楔子

关于如何搭建SpringBoot工程以及开启Web功能,
可以查看我的这篇博客:用Spring Initializr快速构建SpringBoot及整合MVC

SpringBoot是Pivotal团队开发的Spring框架,整合了许多的框架,采用生产就绪的观点,旨在简化配置、快速开发。因此我们不需要做太多的配置就能使得SpringBoot程序正常运行,甚至号称"零配置",也就是所谓的"约定>配置"。但是在一些特殊情况下,我们需要有自己的配置或者修改一些配置,也就是说当我们违反了和SpringBoot的约定时,我们需要进行配置

properties和yml

大家在用IDEA中的Spring Initializr创建一个SpringBoot工程时,其实系统会默认在src/main/java/resources目录创建一个配置文件application.properties,当然SpringBoot也支持yml格式的配置文件,我们在实际开发中,也是以yml配置文件为主。这是为什么呢?我们先来看两段配置("#"为单行注释):

application.properties

server.port=80  #配置端口号
server.servlet.context-path=/taoBao #配置项目名

application.yml

server:
  port: 80 #配置端口号
  servlet:
    context-path: /taoBao #配置项目名

经过对比可以发现,yml格式的文件层次感会更强一些,更加方便维护和管理其实刚开始的时候,我也没太发现,主要是不习惯

自定义属性

YML中的value支持多种类型:字符串、数值、浮点数、List、Map集合…当我们需要的时候,我们也可以在配置文件application.yml中自定义属性,如:

person:
  name: guqueyue #字符串
  age: 18 #数值
  hobbies: #List集合
    - Java
    - 读书
    - 辩论
  address: #map集合
    province: 江西省
    city: 吉安市

配置文件中的自定义属性,也可以从配置文件中读取值,如:

man:
  name: ${person.name} #从配置文件中读取值

或者我们也可以运用${random}生成各种不同类型的随机值,如:

my:
  name: guqueyue
  greeting: hi, I'm ${my.name}
  number: ${random.int} #随机生成一个int类型的数值
  uuid: ${random.uuid} #随机生成一个uuid
  max: ${random.int(66)} #随机生成一个小于66的整数
  value: ${random.value} #随机生成一个值

但是在配置过程中一定需要注意两点:

  • 配置信息一定要注意缩进
  • 冒号: 后必须要跟一个空格

单值读取

配置已经有了,那么我们怎么从application.yml配置文件中读取属性值?
如,在配置文件application.yml中配置:

person:
  name: guqueyue #字符串
  age: 18 #数值

man:
  name: ${person.name} #从配置文件中读取值

其实我们只需要在变量上加@Value("${属性名}")注解,即可将application.yml配置文件的一个属性值赋给一个变量;若要单独给变量赋值,在变量上加上@Value("属性值")注解即可,如:

@Value("guqueyue")
private String name;

但最好不要这样,毕竟SpringBoot的理念是配置>编码,能配置尽量配置,再新建一个controller,代码如下:

/**
 * @author guqueyue
 * @Date 2020/4/11
 **/
@RestController
public class ManController {

    @Value("${man.name}")
    private String name;

    @Value("${person.age}")
    private int age;


    @RequestMapping(value = "/man")
    public void man() {
        System.out.println("name: " + name + ", age:" + age);
    }
}

打开浏览器,输入"http://localhost:8080/man",控制台打印如下:
在这里插入图片描述
即说明application.yml配置文件中的属性man.nameperson.age已经成功读取到了SpringBoot应用程序中!

多值读取

多值读取即将配置文件的属性赋值给实体类,如application.yml中配置:

person:
  name: guqueyue #字符串
  age: 18 #数值
  greeting: hi, I'm ${person.name} #从配置文件中读取值
  hobbies: #List集合
    - Java
    - 读书
    - 辩论
  address: #map集合
    province: 江西省
    city: 吉安市

我们只需创建一个实体类,如"Person",如:

/**
 * @author guqueyue
 * @Date 2020/4/11
 * 实体类
 **/
@Data // lombok插件的注解,若未使用lombok插件,请自行生成getter、setter以及toString方法
@ConfigurationProperties(prefix = "person") // prefix - 前缀,必须跟配置中一致
@Component // 让这个类被SpringBoot扫描到
public class Person {

    // 属性的名称和类型必须跟配置文件中的配置一一对应
    private String name;
    private Integer age;
    private String greeting;
    private List<String> hobbies;
    private Map<String, String> address;
}

其中Person类上有一个注解,为@ConfigurationProperties,表明该类为配置属性类,其中的前缀prefix一定要和配置文件中的一致。另外@Component注解,使得SpringBoot在启动时扫描到该类,即通过包扫描将该类作为一个Bean注入到IOC容器中
还有一点需要注意,若是属性的名称跟配置文件中的配置不一致,需要再行配置,如"name"改为"myName",则需要再加注解:

 @Value("${person.name}")
 private String myName;

再新建一个controller用来读取 Person 类的属性,如:

/**
 * @author guqueyue
 * @Date 2020/4/11
 **/
@RestController
public class PersonController {

    @Autowired // 注入Person对象
    private Person person;

    @RequestMapping("/getPerson")
    public Person getPerson() {
        return person;
    }
}

打开浏览器,输入"http://localhost:8080/getPerson",浏览器显示:
在这里插入图片描述
说明读取完成!

自定义配置文件

有时候可能我们需要配置的属性太多,若是都写在application.yml配置文件中就有些不太合适,我们可以自定义配置文件。如在src/main/resources目录下自定义一个名为test.properties的配置文件(不要采用yml格式),在文件中配置如:

com.user.name=guqueyue
com.user.password=123

也可以在配置文件中赋值:

com.man.name=${com.user.name}

虽然我不知道有什么用,但是我知道可以
最重要的是:通过@PropertySource注解加载自定义配置文件!!!

单值读取

新建一个controller,如:

/**
 * @author guqueyue
 * @Date 2020/4/11
 **/
@RestController
// 加载自定义配置文件
@PropertySource(value = "classpath:test.properties") 
public class NameController {


    @Value("${com.user.name}")
    private String name;

    @Value("${com.man.name}")
    private String myName;

    @RequestMapping("/name")
    public void getName() {
        System.out.println(name + "," + myName);
    }
}

运行启动类中的main方法,打开浏览器,输入"http://localhost:8080/name",控制台打印如下:
在这里插入图片描述
读取成功!!!

多值读取

话不多说,直接创建实体类,如:

/**
 * @author guqueyue
 * @Date 2020/4/11
 **/
@Data // lombok插件的注解,若未使用lombok插件,请自行生成getter、setter以及toString方法
@Configuration // 使SpringBoot扫到这个类,将这个类作为一个Bean注入IOC容器中
@PropertySource(value = "classpath:test.properties") // 加载自定义配置文件
@ConfigurationProperties(prefix = "com.user") // prefix - 前缀,必须和配置中一致
public class User {
    private String name;
    private String password;
}

其中@Configuration注解包含@Component注解,再新建一个controller,如:

/**
 * @author guqueyue
 * @Date 2020/4/11
 **/
@RestController
public class UserController {

    @Autowired // 注入user对象
    private User user;

    @RequestMapping(value = "/user")
    public void getUser() {
        System.out.println(user);
    }
}

启动SpringBoot程序,打开浏览器,输入"http://localhost:8080/user",控制台打印如下:
在这里插入图片描述
说明自定义配置文件的属性被读取到了JavaBean中。

多环境下的配置文件

在我们实际的开发过程中,不同的环境下会有不同的配置文件,如:开发环境、测试环境、生产环境等。我们可以在配置文件application.yml中指定不同环境下的配置文件,如配置文件的格式为application-{profile}.yml,其中{profile}为环境标识,例如:

  • application-dev.yml —— 开发环境

  • application-test.yml —— 测试环境

  • application-prod.yml —— 生产环境

则我们可以src/main/resources下新建application-dev.ymlapplication-test.yml以及application-prod.yml三个配置文件,如图:
在这里插入图片描述
那么,我们该如何决定使用哪个环境下的配置文件呢?
例如,我们想使用开发环境下的配置文件application-dev.yml,则在配置文件application.yml中配置:

spring:
  profiles:
    active: dev

再在配置文件application-dev.yml中配置一下端口号:

server:
  port: 8762

运行SpringBoot程序,通过控制台打印的日志,得知应用程序的访问端口号已经由默认的"8080"变成了application-dev.yml配置文件中的"8762",则说明配置已经生效了。
在这里插入图片描述

发布了23 篇原创文章 · 获赞 181 · 访问量 9108

猜你喜欢

转载自blog.csdn.net/Qizhi_Hu/article/details/105438923