4springboot的配置文件及yml使用

配置文件

作用:spring boot 自动配置(约定,8080 ).可以使用配置文件 对默认的配置 进行修改

application.properties的修改方式

 

yml修改方式

 

例子:

把默认端口8080修改为8888,访问成功:

 

 

默认全局配置文件有两种类型:

  application.properties

    操作:application.properties采用 :key=value  形式进行配置,无论是配置什么类型的数据,都是 k = v 形式配置,有时候给一个类的属性赋值,这个属性套了很多层,那么只有k变长一点,value不变,例:  server.servlet.encoding.charset= UTF-8  ,server.servlet.encoding.charset这个是key , 后面的UTF-8是值。

 

  application.yml 

    application.ymlyaml ain't myarkup language ,不是一个标记文档   

xml:是一个标记文档,如下:

  <server>
    <port>8882</port>
    <path>/a/b/c</path>
  </server>

 

yml语法

  •    key:空格value 
  •    通过垂直对齐 指定层次关系
  •    value默认可以不写引号; ""会将其中的转义符进行转义(也就是说加了双引号的value,里面如果包含\n换行会生效,而单引号/不加任何符号则直接输出),其他不会

 

yml写法有两种形式,不过只有Java的八大基本数据类型是不区分  行内写法/垂直对齐写法

yml行内写法

接下来用下面的例子展示yml不同数据类型的行内写法

 yml除了可以配置之外,还可以属性绑定:

例:创建一个实体类对象,并且绑定属性

 

@Component  //把实体类加入ioc容器
@ConfigurationProperties(prefix = "student") //属性绑定声明  这里的student对应yml那边的student
public class Student {
    private String name;   //字符串类型
    private int age;       //整型
    private boolean sex;    //布尔型
    private Date birthday;     //日期型
    private Map<String,Object> location;       //Map集合
    private String[] hobbies;       //字符串数组
    private List<String> skills;    // list集合
    private Pet pet;//宠物        //对象类型
  
    
      getter/setter方法省略,自己可以生成
    toString省略 }

 

补充Pet类:

public class Pet {
    int age;
    String name;

    getter/setter省略
  toString省略 }

然后在yml配置文件注入值,首先是使用行内写法:

 

Student:
  name: zs
  age: 23
  sex: true
  #上面三个都是基本数据类型,不区分写法,直接写

  #日期类型
  birthday: 2019/02/12

  #map集合
  location: {province: 广东,city: 广州,zone: 增城区}

  #数组和list\set集合 输入格式一样 ,中括号可以省略
  hobbies: [足球,篮球]

  #list集合
  skills: [编程,金融]

  #对象类型
  pet: {name: wc11,strain: hsq}

总结:行内写法,map集合和对象类型一样形式是 {key:空格value , .. };数组和list/set集合都一样是[a,b,c] 中括号还可以省略。

 

yml垂直对齐写法

Student:
  name: zs
  age: 23
  sex: true
  #上面三个都是基本数据类型,不区分写法,直接写

  #日期类型
  birthday: 2019/02/12

  #map集合
  location:
    province: 广东
    city: 广州
    zone: 增城区

  #数组和list\set集合 输入格式一样
  hobbies:
  - 足球
  - 篮球

  #list集合
  skills:
  - 编程
  - 金融

  #对象类型
  pet:
    name: wc11
    age: 12

垂直对齐形式,map集合和对象类型是同一写法,格式如下:

map/对象类型

  key:空格value

  key:空格value

而数组和list/set集合也一样,格式如下:

数组/list/set:

  -空格xx

  -空格xx

 

数据绑定后,在测试类里面装配一个学生对象测试:

数据绑定成功,如上图输出了绑定的数据信息, yml里面配置的属性确实打印出来的,测试成功。

 注意:@Qualifier()注解要结合@Autowire()注解才生效,另外属性绑定是通过yml的头部的student和实体类声明的@ConfigurationProperties(prefix = "student")名字对应才生效,忽略大小写。

 

yml总结

application.properties配置方式 : key=value

application.yml配置方式:

   1. key:空格value   简单属性配置

   2.通过垂直对齐 指定层次关系

   3.value默认可以不写引号; ""会将其中的转义符进行转义,其他不会

 

数据类型yml的两种配置方式:

  1、list/set/数组

    1.1 行内写法  hobbies: [足球,篮球]      中括号可省略

    1.2 垂直方式  hobbies:

            - 足球

            - 篮球

  2、对象/map

    2.1 行内写法  location :{province: 广东,city: 广州,zone: 增城区}  注意v前面有空格

    2.2 垂直方式  location :  

        province: 广东
        city: 广州            通过垂直对齐表示层次关系

 

 

属性注入

上面我们举的yml属性注入例子,是通过@ConfigurationProperties()注解来实现绑定的,还有一个注解可以实现属性绑定注入。

那就是 @Value("xx")注解,@Value注解可以直接写到实体类的属性上面,也可以通过springEL表达式,在配置文件中获取注入的值。

例子:

上面的例子,我结合了两个注解的使用,也就是@Value()和@ConfigurationProperties(),他们的属性都已经绑定注入了,控制台也输出了结果,可以发现是可以结合使用的,另外在yml没设置name属性是因为,会覆盖@Value()的注入,配置文件的优先级高于@Value()注解。

补充:.properties和.yml文件同时配置一个相同属性,.properties的会生效,因为优先级高。

@Value()和@ConfigurationProperties()区别

  @configurationProperties @Value
注值方式 批量注入 单个注入
松散语法 支持 不支持
SpringEL语法 不支持 支持
JSR303数据检验 支持 不支持
注入复杂类型 支持 不支持

 

 

 

 

 

 

 

1、松散语法:对类似的格式,限制不那么严格,比如:变量 userName  =  user_name  =  user-name ,这个三个在松散语法里面都是指同一个属性。

在yml里面写了 Student.user-name="zs" ,那边的实体类名字虽然是userName,但是还是会被注入值。

 

2、SpringEL语法:格式  ${对象.变量名},注意只能在@Value注解中使用,因为只有@Value支持SpEL语法,如下

 

 

 

3、JSR303数据检验:例如我有一个属性是Email,那么注册的时候需要写if语句/正则表达式判断是否为邮箱类型,有了JSR303数据检验就可以用一个注解搞定,如下:

@Validated  //开启jsr303数据检验的注解
public class Student {

    @Email   
    String email;
View Code

然后在yml文件那边邮箱乱填一些数据,运行如下图:

如果邮箱格式错误,就会抛出异常,另外我这个@Email注解使用的依赖如下:

<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.4.Final</version>
        </dependency>

注意,@Email注解使用依赖版本太高(例如:6.0.18版本)会无效,甚至运行不起来。

下面测试@Value()注解不支持JSR303数据检验:

 

 还有一个复杂类型注入就不测试了,只有@configuration支持注入复杂数据类型,@Value注解不支持复杂类型注入,上面的表格可以自己测试一下。

 

@PropertySource

  作用:指定配置文件被加载。

  springboot默认会加载application.properties/application.yml文件中的数据,但是如果自己配置的属性不在这两个文件中呢,比如我在conf.properties中配置了属性,那么就要使用@PropertySource注解在实体类加载conf.properties配置文件。

@PropertySource(value = "{classpath:conf.properties}")  //声明当前student实体类加载conf.properties配置文件
public class Student {
...

但是,@PropertySource注解只能加载.properties文件,不能加载.yml文件.

The end.

posted @ 2020-02-23 10:07  HainChen  阅读(1040)  评论(0编辑  收藏  举报