1.Springboot之配置文件

1.配置文件

  SpringBoot使用一个全局的配置文件,配置文件名是固定的:application.propertiesapplication.yml。配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;

2.YAML

  YAML(YAML Ain’t Markup Language)不是一个标记语言;YAML以数据为中心,比json、xml等更适合做配置文件;如下配置例子:

server:
  port: 8081

2.1基本语法:

详细语法参考此教程:https://www.runoob.com/w3cnote/yaml-intro.html
yaml语法极其严格:

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • '#'表示注释

2.2数据类型:

2.2.1字面量:普通的值

  字面量:普通的值 [ 数字,布尔值,字符串 ]。字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;

  "":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思

name: "zhangsan \n lisi":输出;zhangsan 换行 lisi

  '':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据

name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi
2.2.2对象、Map(属性和值)(键值对):

  对象键值对使用冒号结构表示 key: value,冒号后面要加一个空格。也可以使用 key:{key1: value1, key2: value2, ...}。还可以使用缩进表示层级关系;

key: 
    child-key: value
    child-key2: value2
2.2.3数组(List、Set):

  以 - 开头的行表示构成一个数组:

pets:
 ‐ cat
 ‐ dog
 ‐ pig

  行内写法

pets: [cat,dog,pig]

3.配置文件值注入

  通过编写一个Person实体类,指定application.yml配置里面的值进行值注入,并在junit单元进行测试输出,首先在pom文件导入如下坐标,不然你编写YAML文件会出现图中问题。

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

在这里插入图片描述

  然后application.yml如下:

person:
  last-name: 雾山五行
  sex: 男
  age: 20
  birth: 2000/01/01
  map:
    property: v1
    form: v2
  list:
    - list1
    - list2
  Dog:
    name: 火焰狗
    age: 2

  然后编写实体类Person,首先把这个类标记为组件,使用@Component,只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能。
   @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;prefix = "person":配置文件中哪个下面的所有属性进行一一映射。然后springboot会自动将配置文件中配置的每一个属性的值,映射到这个组件中。

@Data
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastName;
    private String sex;
    private Integer age;
    private Date birth;

    private Map<String, String> map;
    private List<Object> list;
    private Dog dog;
}

测试输出:

@SpringBootTest
@RunWith(SpringRunner.class)
class SpringbootConfigApplicationTests {
    @Autowired
    Person person;

    @Test
    void contextLoads() {
        System.out.println(person);
    }
}

在这里插入图片描述

3.1松散绑定(松散语法)和@value值注入方式

  松散绑定是指比如我在yaml中写如下都是一样的

person:
  lastName: 雾山五行
  last-name: 雾山五行
  last_name: 雾山五行
  LAST_name: 雾山五行
  LAST_NAME: 雾山五行

  @Value获取值很麻烦,不推荐使用,他的作用用bean标签来解释如下

<bean class="Person">
      <property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>
 <bean/>

3.2@Value获取值和@ConfigurationProperties获取值比较

  如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
  如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties

@ConfigurationProperties@Value
功能批量注入配置文件中的属性一个个指定
松散绑定(松散语法)支持不支持
SpEL不支持支持
JSR303数据校验支持不支持
复杂类型封装支持不支持

4.加载指定的配置文件

4.1@PropertySource加载指定的properties

  上面说的是加载SpringBoot的默认配置文件,但是呢,我们想弄个特殊,加载自己自定义的配置文件。则在实体类Person类中加入注解@PropertySource。同时把默认配置文件的person属性改成persons来避免读到默认的配置文件的内容。

@PropertySource(value = {"classpath:person.properties"})
@ConfigurationProperties(prefix = "person")

person.properties配置文件的内容

person.lastName=mary
person.sex=female
person.age=22
person.birth=2017/12/15
person.map.k1=v1
person.map.k2=14
person.list=a,b,c
person.dog.name=hot dog
person.dog.age=3

输出
在这里插入图片描述

4.2@PropertySource加载指定的YAML

  有人说,你不是推荐使用YAML吗,上面的例子又是properties的,我要加载指定的YAML。可以,首先新建一个PropertySourceFactory实体类,用于处理 yml 配置文件的属性资源工程

public class PropertySourceFactory extends DefaultPropertySourceFactory {
    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
        if (resource == null) {
            return super.createPropertySource(name, resource);
        }
        List<PropertySource<?>> sources = new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource());
        return sources.get(0);
    }
}

  然后新建一个YAML配置文件

person:
  LAST_NaME: 法外狂徒:张三
  sex: 男
  age: 20
  birth: 2000/01/01
  map:
    property: v1
    form: v2
  list:
    - list1
    - list2
  Dog:
    name: 火焰狗
    age: 2

  person实体类改为如下:注意:导入你自己刚刚写的那个PropertySourceFactory实体类路径

import cn.smm.springbootconfig.utils.PropertySourceFactory;

@Data
@Component
//@PropertySource(value = {"classpath:person.properties"})
@PropertySource(value = {"classpath:person.yml"}, factory = PropertySourceFactory.class)
@ConfigurationProperties(prefix = "person")
public class Person {

测试输出在这里插入图片描述

5.配置文件占位符

5.1随机数

  配置文件还可以编写占位符生成随机数

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

5.2属性配置占位符

  占位符获取之前配置的值,如果没有可以是用:指定默认值
上面两个的测试例子如下:修改YAML文件

person:
  LAST_NaME: 法外狂徒:张三${random.uuid}
  sex: 男
  age: ${random.int[10,50]}
  birth: 2000/01/01
  map:
    property: v1
    form: v2
  list:
    - list1
    - list2
  Dog:
    name: ${person.hello:hot}_dog
    age: 2

在这里插入图片描述
在这里插入图片描述

  

  

  

  

  

  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值