Spring Boot 配置文件

2021-03-03 22:29

阅读:591

标签:bind   ppi   people   rop   return   open   value   顺序   ram   

一、全局配置文件

1、分类:(文件名固定)

(1)application.properties
(2)application.yml
(3)以上两种文件作用类似,但是内部写法有些区别。

2、作用:

  修改 SpringBoot 自动配置的默认值。

3、什么是yml

  YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,其以“数据为中心”,比json、xml文件更适合做配置文件。

技术图片
【xml配置文件的写法举例:】
8090

【properties配置文件的写法举例:】
server.port = 8090

【yml配置文件的写法举例:】
server:
port: 8090 # 注意,8090 与 : 间有个空格。

使用Idea 编写yml配置文件时,若没有提示,可以下个yml插件。


技术图片

 

回到顶部

二、YAML语法

1、基本语法

(1)使用缩进表示各元素间的层级关系。其中使用空格来缩进,不能使用Tab键。
(2)空格数不做要求,但是相同层级元素的左侧需要对齐。
(3)大小写敏感。

2、支持数据格式

(1)支持对象(键值对的集合,key:value)
  字符串可以不用使用双引号或单引号圈起来
  双引号圈住时不会转义字符串中的特殊字符
  单引号圈住时会转义字符串中的特殊字符

技术图片
【分层写法:】
对象名:
    k1: v1
    k2: v2
    #注意  : 后面有个空格。

【行内写法:】
对象名:{k1: v1,k2: v2}


技术图片

(2)数组:一组按顺序排列的值

技术图片
【分层写法:】
数组名:
    - 元素1
    - 元素2

【行内写法:】
数组名:[元素1,元素2,元素3]


技术图片

(3)字面量:单个的、不可再分的值(数字、字符串、布尔值、日期)

 

回到顶部

三、配置文件值的映射

  将配置文件中配置的属性值映射到组件中。

1、@ConfigurationProperties

  用于 告诉 SpringBoot 将本类中的属性与配置文件中的内容相关联(绑定)。其有个参数 prefix 用于找到配置文件中指定的属性。
注:
  只有容器中的组件才能使用此标记的功能。需给其加个@Component注解。

举例:
  用到四个类:
    HelloworldApplication.java 用于启动SpringBoot应用。
    HelloWorldController.java 用于处理浏览器的请求。
    People.java 配置文件映射的实体类。
    Teacher.java 作为People中的一个对象。

  配置文件
    application.yml 与 application.properties二者选其一即可。

技术图片

 

 

技术图片
【举例:多余的注释就不写了】
【HelloworldApplication.java】
package com.example.helloworld;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HelloworldApplication {

public static void main(String[] args) {
    SpringApplication.run(HelloworldApplication.class, args);
}

}

【HelloWorldController.java】
package com.example.helloworld.controller;

import com.example.helloworld.entity.People;
import com.example.helloworld.entity.Teacher;
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;

@Controller
public class HelloWorldController {
//自动注入对象
@Autowired
People people;
@Autowired
Teacher teacher;

@ResponseBody
@RequestMapping("/hello")
public String show() {

return people.toString() + teacher.toString();

}
}

【People.java】
package com.example.helloworld.entity;

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

import java.util.Date;
import java.util.List;
import java.util.Map;

/**

  • 用于测试各种类型的映射
    */
    @Component
    @ConfigurationProperties(prefix = "people")
    public class People {

private Integer age;
private Boolean boss;
private List cityList;
private Date date;
private Map map;
private String name;
private Teacher teacher;

public Integer getAge() {
return age;
}

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

public Boolean getBoss() {
return boss;
}

public void setBoss(Boolean boss) {
this.boss = boss;
}

public List getCityList() {
return cityList;
}

public void setCityList(List cityList) {
this.cityList = cityList;
}

public Date getDate() {
return date;
}

public void setDate(Date date) {
this.date = date;
}

public Map getMap() {
return map;
}

public void setMap(Map map) {
this.map = map;
}

public String getName() {
return name;
}

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

public Teacher getTeacher() {
return teacher;
}

public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}

@Override
public String toString() {
return "People{" +
"age=" + age +
", boss=" + boss +
", cityList=" + cityList +
", date=" + date +
", map=" + map +
", name=‘" + name + ‘‘‘ +
", teacher=" + teacher +
‘}‘;
}
}

【Teacher.java 】
package com.example.helloworld.entity;

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

@Component
@ConfigurationProperties(prefix = "people.teacher")
public class Teacher {

private Integer age;
private String name;

public Integer getAge() {
return age;
}

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

public String getName() {
return name;
}

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

@Override
public String toString() {
return "Teacher{" +
"age=" + age +
", name=‘" + name + ‘‘‘ +
‘}‘;
}
}

【application.yml (注意层级关系以及空格)】
people:
age: 18
boss: false
cityList:
- Beijing
- Nanjing
date: 2019/7/21
map: {k1: v1, k2: v2}
name: Tom
teacher:
age: 30
name: Jarry

【application.properties(使用这个也行)】
people.age=18
people.boss=false
people.date=2019/7/21
people.city-list=Beijing, Nanjing
people.map.k1=v1
people.map.k2=v2
people.name=Tom
people.teacher.age=25
people.teacher.name=Jarry

【注:】
配置文件优先级问题,后续会讲。此处若application.properties与application.yml同时存在,
则对于重复部分application.properties优先级高于application.yml(即覆盖掉application.yml中重复的内容)。


技术图片

技术图片

当写@ConfigurationProperties时,会有相关提示信息,提示下载配置文件处理器,功能是:当配置文件进行映射时会有相关提示。

技术图片

点击Open Documentation后,在联网状态下会进入一个网址,找到相关依赖信息。

技术图片

复制下来后,粘贴在项目的pom.xml的相应位置中。

技术图片

重启一下Idea即可。

技术图片

 

2、@Value

(1)格式:

@Value("${key}")
@Value("#{表达式}")
@Value("字面量(字符串、日期、数字、布尔值)")

(2)举例:
  使用@Value时,也需要@Component组件,且value是一个个映射,需要自己输入值。

技术图片
【举例:仅修改People.java】
package com.example.helloworld.entity;

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

import java.util.List;

/**

  • 用于测试各种类型的映射
    */
    @Component
    public class People {

@Value("#{11*13}")
private Integer age;
@Value("true")
private Boolean boss;
@Value("${cityList:1,2,3}")
private List cityList;

public Integer getAge() {
return age;
}

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

public Boolean getBoss() {
return boss;
}

public void setBoss(Boolean boss) {
this.boss = boss;
}

public List getCityList() {
return cityList;
}

public void setCityList(List cityList) {
this.cityList = cityList;
}

@Override
public String toString() {
return "People{" +
"age=" + age +
", boss=" + boss +
", cityList=" + cityList +
‘}‘;
}
}


技术图片

技术图片

 

 (3)@Value与@ConfigurationProperties的区别

@ConfigurationProperties                              @Value
可以批量配置属性的映射                                 需要手动一个个的配置
支持松散绑定(比如lastName可以写成last_name)           不支持松散绑定
不支持表达式                                          支持表达式
支持JSR-303验证 (@Validated)                        不支持JSR-303验证

3、@PropertySource与@ImportResource

(1)@PropertySource用于加载指定位置的文件,只能用于properties,可以加载多个配置文件。

@PropertySource(value = "{classpath:XXX.properties}")

(2)@ImportResource用于导入外置的配置文件(比如Spring的配置文件)。

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

 

4、配置文件中的占位符

(1)可以在配置文件中,添加一些随机数(比如 ${random.int})。
(2)可以通过占位符获取之前已经设置的值。
  ${random.int} 用于获取一个随机的int值
  ${name : Rick} 用于设置默认值。若之前没有name配置,则默认值为Rick

技术图片
【举例:改变application.properties】
people.age=${random.int}
people.boss=false
people.date=2019/7/21
people.city-list=Beijing, Nanjing
people.map.k1=v1
people.map.k2=v2
people.name=Tom
people.teacher.age=${people.age}
people.teacher.name=${name : Rick}
技术图片

技术图片

 

5、profile

  profile是对不同环境(比如开发、生产、测试环境)提供的不同配置功能的支持,可以通过激活或指定参数等方式快速切换环境。
(1)存在多个profile配置文件时,
  文件名格式为:application-{profile}.properties 或 application-{profile}.yml
  但是系统默认调用全局配置文件(application.properties 或 application.yml).
  比如创建一个 profile文件,文件名为 application-test.properties
  若想调用某个指定的profile,可以在 全局配置文件中通过(spring.profiles.active)激活。
  比如: spring.profiles.active = test

(2)对于yml文件可以存在profile文档块的方式,使用(---)分割,并在全局配置文件中激活。

技术图片
【举例:application.yml中】
server:
  port: 7090
spring:
  profiles:
    active: test2
---
server:
  port: 8090
spring:
  profiles:test

server:
port: 9090
spring:
profiles:test2


技术图片

(3)在IDEA中配置profiles激活。
  如下图,找到相关位置,添加需要激活的环境即可。

--spring.profiles.active=test

技术图片

技术图片

 

(4)通过命令行参数的方式。
  执行打包命名后,执行jar包时,在其后输入添加需要激活的环境即可。

java -jar 包名 --spring.profiles.active=test

 

6、配置文件加载路径、以及路径优先级问题

(1)自动扫描:
  SpringBoot启动后,会自动扫描以下目录下的 application.properties 或者 application.yml,并让其作为默认的配置文件。

技术图片
优先级从高到低。file指的是当前项目的根目录。classpath指的是当前resource路径
file:./config/
file:./
classpath:./config/
classpath:./

这些路径均会被加载,当配置文件有重复内容时,高优先级的会覆盖掉低优先级的,最终所有路径下的配置文件形成互补配置。


技术图片

(2)修改默认配置
  在项目打包后,可以通过命令行参数的形式,启动项目的同时,指定配置文件的位置。是一种用于运维时补救的措施。该配置文件会与项目中的配置文件形成互补配置。

java -jar 包名 --spring.config.location=XXX.yml

 

Spring Boot 配置文件

标签:bind   ppi   people   rop   return   open   value   顺序   ram   

原文地址:https://www.cnblogs.com/huoyz/p/14381418.html


评论


亲,登录后才可以留言!