• 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,里面如果包含 换行会生效,而单引号/不加任何符号则直接输出),其他不会

    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: 增城区}
    
      #数组和listset集合 输入格式一样 ,中括号可以省略
      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: 增城区
    
      #数组和listset集合 输入格式一样
      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.

  • 相关阅读:
    慕课网-安卓工程师初养成-6-3 如何使用 Java 中的数组
    慕课网-安卓工程师初养成-6-2 练习题
    慕课网-安卓工程师初养成-6-1 什么是数组
    慕课网-安卓工程师初养成-5-5 进阶练习
    慕课网-安卓工程师初养成-5-4 使用 Eclipse 调试程序
    慕课网-安卓工程师初养成-5-3 编程练习优化
    慕课网-安卓工程师初养成-5-2 编程练习解析
    币种统计
    先取不败游戏
    贪心算法——数列操作得到最大的值
  • 原文地址:https://www.cnblogs.com/unlasting/p/12312854.html
Copyright © 2020-2023  润新知