SpringBoot properties和yml的区别

一。先附一个yml文件的解析步骤html

1.Maven依赖java

  <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
            <version>1.10</version>
        </dependency>

2.yml文件python

name: hha age: 60 friend: - good - easy - bug params: addr: ZZ code: EE name: 洗洗

3.实体类spring

package com.my.last; import java.util.List; import java.util.Map; public class Student { private String name; private int age; private List<String> friend ; private Map<String, Object> params; /** * @return the name */ public String getName() { return name; }

    /** * @param name the name to set */ public void setName(String name) { this.name = name; }

    /** * @return the age */ public int getAge() { return age; }

    /** * @param age the age to set */ public void setAge(int age) { this.age = age; }

    /** * @return the friend */ public List<String> getFriend() { return friend; }

    /** * @param friend the friend to set */ public void setFriend(List<String> friend) { this.friend = friend; }

    /** * @return the params */ public Map<String, Object> getParams() { return params; }

    /** * @param params the params to set */ public void setParams(Map<String, Object> params) { this.params = params; }

    /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "Student [name=" + name + ", age=" + age + ", friend=" + friend + ", params=" + params + "]"; } }

4.测试类apache

package com.my.last; import org.yaml.snakeyaml.Yaml; public class Test { public static void main(String[] args) { Yaml yaml = new Yaml(); Student student = yaml.loadAs(Test.class.getResourceAsStream("/test.yml"), Student.class); System.out.println(student); }
}

 或者依赖 json

<dependency> <groupId>org.jyaml</groupId> <artifactId>jyaml</artifactId> <version>1.3</version> </dependency>

解析方法:springboot

Student student2 = null; try { student2 = org.ho.yaml.Yaml.loadType(Test.class.getResourceAsStream("/test.yml"), Student.class); } catch (FileNotFoundException e) { // TODO Auto-generated catch block
 e.printStackTrace(); } System.out.println(student2);

二.两者区别app

在于其拥有自然的树状结构,因此着手尝试将properties文件更改成yml文件,发现了几个要注意的地方:
一、在properties文件中是以”.”进行分割的, 在yml中是用”:”进行分割;
二、yml的数据格式和json的格式很像,都是K-V格式,而且经过”:”进行赋值;
三、在yml中缩进必定不能使用TAB,不然会报很奇怪的错误;(缩进特么只能用空格!!!!)
四、yml每一个k的冒号后面必定都要加一个空格;
五、使用spring cloud的maven进行构造的项目,在把properties换成yml后,必定要进行mvn clean insatll maven

六、yml是跨语言的:能够在包括JAVA,go,python等大量的语言中使用,好比作云计算使用go和java的时候,能够经过配置中心使用同一份配置! ide

七、支持列表:区别于properties只支持键值对数据,yml配置文件支持列表,以下所示:

 

 

固然,从properties转yml文件会遇到不少坑,在此记录下:

1,层级关系缩进不能用tab键:每次都数2.4.6这样打空格。。。

2,每一个key的后面须要加:,每一个:后面还须要加一个空格!

3,列表的短横线后面须要有个空格。

两个关键点:

第一个是yml是支持中文内容的,properties想使用中文只能用unicode编码

第二个是顺序问题,properties是不保证加载顺序的,yml有前后顺序,实际用例好比springcloud的zuul网关路由配置,若是一个uri同时知足两个匹配规则,properties你是不知道它到底使用了哪一个规则的,而yml则必定是使用了靠的那个路由规则

Java 的 Properties 加载属性文件后是没法保证输出的顺序与文件中一致的,由于 Properties 是继承自 Hashtable , key/value 都是直接存在 Hashtable 中的,而 Hashtable 是不保证进出顺序的。

总有时候会有关心顺序一致的需求,恰若有 org.apache.commons.collections.OrderdMap(其实用 LinkedHashMap 就是保证顺序) 同样,咱们也想要有个 OrderdProperties。

详见: https://blog.csdn.net/qq1169091731/article/details/53012071

三。Spring Boot中application.properties和application.yml加载顺序

使用@PropertySource注解加载自定义配置文件,该注解没法加载yml配置文件。使用@Value注解得到文件中的参数值

application.properties和application.yml文件能够放在一下四个位置:

  • 外置,在相对于应用程序运行目录的/congfig子目录里。
  • 外置,在应用程序运行的目录里
  • 内置,在config包内
  • 内置,在Classpath根目录

一样,这个列表按照优先级排序,也就是说,src/main/resources/config下application.properties覆盖src/main/resources下application.properties中相同的属性,如图:

 

 

此外,若是你在相同优先级位置同时有application.properties和application.yml,那么application.properties里面的属性就会覆盖里application.yml的属性

详见:https://www.cnblogs.com/lukelook/p/10583003.html

相关文章
相关标签/搜索