Spring Boot的配置文件及properties和yml的用法

配置文件

  • 1、配置文件
  • 2、YAML语法
    • 1、基本语法
    • 2、值的写法
      • 字面量:普通的值(数字,字符串,布尔)
      • 对象、map(属性和值)(键值对)
      • 数组(List、Set)
  • 3、 配置文件值注入
    • yml 文件写法
    • properties文件写法
    • 注入方式比较
    • 配置文件注入值数据校验
    • @PropertySource
  • 配置文件占位符
    • RandomValuePropertySource:配置文件中可以使用随机数
    • 属性配置占位符
  • Profile多环境支持
    • 1、多profile文件形式
      • 就是properties格式
    • 2、多profile文档块模式
      • 就是yml格式
    • 3、激活方式
  • 配置文件位置优先级高-》低
  • 外部配置加载顺序
  • 配置文件可以有哪些选项
  • 遇见的错误
    • 1 运行测试类发现汉字乱码

1、配置文件

Spring Boot使用一个全局的配置文件,配置文件名是固定的,有两种方式;

  • application.properties
  • application.yml

配置文件的作用:修改Springboot自动配置的默认值。
YAML(yml:YAML Ain’t Markup Language):是一个标记语言又不是一个标记语言
标记语言:以前的配置文件,大多数使用xml文件;现在yml:以数据为中心,比json、xml等更适合做配置文件;
YAML配置例子:

server:
  port: 8081

XML例子:


		8081

2、YAML语法

1、基本语法

k:(空格)v:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要左对齐的一列数据,都是一个层级的
属性和值也是大小写敏感

2、值的写法

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

k: v:

  • 字面直接来写;
  • 字符串默认不用加上单引号或者双引号;
  • “”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
  • 单引号:会转义特殊字符,特殊字符只会是一个普通的字符串数据

对象、map(属性和值)(键值对)

k: v:在下一行来写对象的属性和值的关系;注意缩进

friends:
	lastName:zhangsan
	age:20
  • 行内写法
    friends:{lastName:zhagnsan,age:18}

数组(List、Set)

  • - 值表示数组中的一个元素
pets:
	- cat
	- dog
	- pig
  • 行内写法
    pets: [cat,dog,pig]

3、 配置文件值注入

yml 文件写法

yml文件

Person:
  lastName: zhangsan
  age: 18
  boss: false
  birth: 2017/12/12
  maps: {k1: v1,k2: v2}
  lists:
    - lisi
    - wangwu
  dog:
    name: 小狗
    age: 2

@ConfigurationProperties的java文件

/**
 * 将文件中配置的每一个属性的值,映射到这个组件中
 * @ConfigurationProperties:告诉Spring boot 将本类中的所有属性和配置文件中相关的配置进行绑定
 * prefix = "person":配置文件中哪个下面的所有属性进行一一映射
 */
@Component//只有组件是容器中的组件,才能容器提供的@ConfigurationProperties功能
@ConfigurationProperties(prefix = "person")//默认从全局变量中获取值
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;

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

我们可以导入配置文件处理器,以后编写yml配置就有提示


        
            org.springframework.boot
            spring-boot-configuration-processor
            true
        

properties文件写法

person.last-name=张三
person.age=18
person.birth=2019/12/12
person.boss=false
person.lists=a,b,c
person.maps.k1=v1
person.maps.k2=v2
person.dog.name=dog
person.dog.age=2

运行测试类发现汉字乱码

注入方式比较

区别 @ConfigurationProperties @Value
功能 批量注入配置文件的属性 单个注入
松散语法注入 支持 不支持
SpEL支持 不支持 支持
JSR303数据校验 支持(类上使用@Validated注解配合相应校验注解) 不支持
复杂类型封装取值 支持 不支持

得出:

  • 我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
    例如:
package ink.poesy.springboot01helloworldquick.Controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController//@ResponseBody和@Controller的集合
public class HelloWorldQuick {
    @Value("${Person.lastName}")//$为获取配置文件中的取值符号
    String userName;
    @RequestMapping("hello")
    public String helloWorldQuick(){
        return "Hello World Quick Create Spring Boot!我是" + userName;
    }
}
  • 如果说,我们专门编写一个JavaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties
    配置文件yml或是properties都能获取到值

配置文件注入值数据校验

/**
 * 将文件中配置的每一个属性的值,映射到这个组件中
 * @ConfigurationProperties:告诉Spring boot 将本类中的所有属性和配置文件中相关的配置进行绑定
 * prefix = "person":配置文件中哪个下面的所有属性进行一一映射
 */
@Component//只有组件是容器中的组件,才能容器提供的@ConfigurationProperties功能
@ConfigurationProperties(prefix = "person")
@Validated//JSR303数据校验
public class Person {
    @Email//校验规则
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;

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

@PropertySource

@PropertySource(value = {class path:person.properties}) :加载我们类路径下value下内容并把他们绑定到类路径下

/**
 * 将文件中配置的每一个属性的值,映射到这个组件中
 * @ConfigurationProperties:告诉Spring boot 将本类中的所有属性和配置文件中相关的配置进行绑定
 * prefix = "person":配置文件中哪个下面的所有属性进行一一映射
 */
@PropertySource(value = {"classpath:person.properties"})//********************************告诉Spring boot加载这个文件************************
@Component//只有组件是容器中的组件,才能容器提供的@ConfigurationProperties功能
@ConfigurationProperties(prefix = "person")
//@Validated//JSR303数据校验
public class Person {
    //@Email//校验规则
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;

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

@ImportResource :导入Spring的配置文件,让配置文件里面的内容生效。
我们自己编写的配置文件Spring boot里面没有Spring的配置文件。把其标在配置类上使用太麻烦,不推荐使用了

package ink.poesy.springboot01helloworldquick;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;

@ImportResource(locations = {"classpath:beans.xml"})//导入Spring的配置文件,但这样太麻烦,看下面有Springboot推荐方法
@SpringBootApplication
public class SpringBoot01HelloworldQuickApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBoot01HelloworldQuickApplication.class, args);
    }

}

Spring Boot推荐给容器添加组件的方式推荐使用全注解的方式

  1. 配置类==Spring配置文件
  2. @Configuration:指明当前类是一个配置类,即来代替之前的Spring配置文件
    原在配置文件中使用
    现使用@Bean:将方法的返回值添加到容器中:容器中这个组件默认的id就是方法名。
package ink.poesy.springboot01helloworldquick.config;

import ink.poesy.springboot01helloworldquick.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration//指明当前类是一个配置类;就是代替之前Spring的配置配件
public class MyAppConfig {
    @Bean//将方法的返回值添加到容器中,容器中这个组件默认的id就是方法名
    public HelloService helloService(){
        return new HelloService();
    }
}

配置文件占位符

RandomValuePropertySource:配置文件中可以使用随机数

  • ${random.value}
  • ${random.int}
  • ${random.long}
  • ${random.int(10)}
  • ${random.int[1024,65536]}

属性配置占位符

可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用)
${app.name:默认值}来指定找不到属性是的默认值(用冒号指定默认值)

Profile多环境支持

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

1、多profile文件形式

就是properties格式

默认使用application.properties,在这里输入spring.profiles.active=dev
我们在配置住配置文件时,文件名可以是:

  • 格式:application-{profile}.properties:
    • application-dev.properties
    • application-prod.properties
      配置文件目录结构
      Spring Boot的配置文件及properties和yml的用法_第1张图片
      在application.properties文件中填写spring.profiles.active=dev代码,激活指定profile

2、多profile文档块模式

就是yml格式

server:
  port: 8080
#文档块
spring:
  profiles:
    active: dev #激活,默认就是8080
---
server:
  port: 8083
spring:
  profiles: dev
---
server:
  port: 8082
spring:
  profiles: prod #指定属于那个配置

3、激活方式

  • 命令行
    –spring.profiles.active=dev
    Spring Boot的配置文件及properties和yml的用法_第2张图片* 配置文件-Dspring.properfiles.active=dev
  • jvm参数

配置文件位置优先级高-》低

Spring Boot的配置文件及properties和yml的用法_第3张图片
高优先级的配置会覆盖低优先级的配置
Springboot会从这四个位置全部加载配置文件,进行互补配置
server.context-path=:表示配置项目访问路径
我们可以通过spring .config.localhost来改变默认的配置路径:项目打包好后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置,指定配置文件和默认加载的这些配置文件共同起作用形成互补配置。

外部配置加载顺序

Springboot支持多种外部配置,优先级从高到低,高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置

  1. 命令行参数:可以修改一切Spring boot默认配置,多个参数中间用空格
  2. 来自java:comp/env的NDI属性
  3. Java系统属性(System.getProperties())
  4. 操作系统环境变量
  5. RandomValuePropertySource配置的random.*属性值
  6. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
  7. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
  8. jar包外部的application.properties或application.yml(不带spring.profile)配置文件
  9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件
  10. @Configuration注解类上的@ProoertySource
  11. 通过SpringApplication.setDefaultProperties指定的默认属性

配置文件可以有哪些选项

配置文件能配置的属性参照官方文档
注解解释:
Spring Boot的配置文件及properties和yml的用法_第4张图片

遇见的错误

1 运行测试类发现汉字乱码

Spring Boot的配置文件及properties和yml的用法_第5张图片
原因:xml默认编码是utf-8,我们需要进行编码转换
解决方法:把勾选的钩上
Spring Boot的配置文件及properties和yml的用法_第6张图片
运行效果:
Spring Boot的配置文件及properties和yml的用法_第7张图片

你可能感兴趣的:(Spring,Boot,java学习之路)