• SpringBoot-配置


    目录

    起步依赖原理分析

    配置文件分类

    YAML

    YAML:基本语法

    YAML:数据格式

    YAML:参数引用

    读取配置内容

    profile

    Profile-小结

    内部配置加载顺序

    外部配置加载顺序


    • 起步依赖原理分析

    • 在spring-boot-starter-parent中定义了各种技术的版本信息,组合了一套最优搭配的技术版本
    • 在各种starter中,定义了完成该功能需要的坐标合集,其中大部分版本信息来自于父工程
    • 我们的工程继承parent,引入starter后,通过依赖传递,就可以简单方便获得需要的jar包,并且不会存在版本冲突等问题
    • 配置文件分类

    • SpringBoot是基于约定的,所以很多配置都有默认值
    • 但如果想使用自己的配置替换默认配置的话,就可以使用application.properties或者application.yml(application.yaml)进行配置
    • properties:
    • server.port=8080
    • yml:
    • server:
      • port:8080
    • 小结
    • SpringBoot提供了2种配置文件类型:properties和yml/yaml
    • 默认配置文件名称:application
    • 在同一级目录下优先级为:properties>yml>yaml
    • YAML

    • YAML全称是YAML Ain't Markup Language
    • YAML是一种直观的能够被电脑识别的的数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的
    • 可以被支持YAML库的不同的编程语言程序导入,比如:C/C++,Ruby,Python,Java,Perl,C#,PHP等
    • YML文件是以数据为核心的,比传统的xml方式更加简洁
    • YAML文件的扩展名可以使用.yml或者.yaml
    • properties:
    • server.port=8080
    • server.address=127.0.0.1
    • xml:
      • 8080
      • 127.0.0.1
    • yml:
    • server:
      • port:8080
      • address:127.0.0.1
    • 简洁,以数据为核心
    • YAML:基本语法

    • 大小写敏感
    • 数据值前边必须有空格,作为分隔符
    • 使用缩进表示层级关系
    • 缩进时不允许使用Tab键,只允许使用空格(各个系统Tab对应的空格数目可能不同,导致层次混乱)
    • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
    • #表示注释,从这个字符一直到行尾,都会被解析器忽略
    • server:
      • port:8080
      • address:127.0.0.1
    • name:abc
    • YAML:数据格式

    • 对象(map):键值对的集合
    • person:
      • name:zhangsan
    • #行内写法
    • person: {name: zhangsan}
    • 数组:一组按次序排列的值
    • address:
      • - beijing
      • - shanghai
    • #行内写法
    • address: [beijing,shanghai]
    • 纯量:单个的、不可再分的值
    • msg1: 'hello \n world' #单引忽略转义字符
    • msg2: "hello \n world" #双引识别转义字符
    • YAML:参数引用

    • name: list
    • person:
      • name: ${name} #引用上边定义的name值
    • 读取配置内容

    • 1.@Value
    • 2.Environment
    • 3.@ConfigurationProperties
    • @Value
      1. server:
      2. port: 8082
      3. name: abc
      4. # 对象
      5. person:
      6. name: zhangsan
      7. age: 20
      8. address:
      9. - beijing
      10. - shanghai
      11. # 对象行内写法
      12. person2: {name: zhangsan,age: 20}
      13. # 数组
      14. address:
      15. - beijing
      16. - shanghai
      17. # 数组行内写法
      18. address2: [beijing,shanghai]
      19. # 纯量
      20. msg1: 'hello \n world' # 不会识别转义字符,会原样输出
      21. msg2: "hello \n world" # 会识别转义字符
    • Environment
    • @ConfigurationProperties
      1. @Component
      2. @ConfigurationProperties(prefix = "person")
      3. public class Person {
      4. private String name;
      5. private int age;
      6. private String[] address;
      7. public String[] getAddress() {
      8. return address;
      9. }
      10. public void setAddress(String[] address) {
      11. this.address = address;
      12. }
      13. public String getName() {
      14. return name;
      15. }
      16. public void setName(String name) {
      17. this.name = name;
      18. }
      19. public int getAge() {
      20. return age;
      21. }
      22. public void setAge(int age) {
      23. this.age = age;
      24. }
      25. @Override
      26. public String toString() {
      27. return "Person{" +
      28. "name='" + name + '\'' +
      29. ", age=" + age +
      30. ", address=" + Arrays.toString(address) +
      31. '}';
      32. }
      33. }
      1. @RestController
      2. public class HelloController {
      3. @Value("${name}")
      4. private String name;
      5. @Value("${person.name}")
      6. private String name2;
      7. @Value("${person.age}")
      8. private String age;
      9. @Value("${address[0]}")
      10. private String address1;
      11. @Value("${msg1}")
      12. private String msg1;
      13. @Value("${msg2}")
      14. private String msg2;
      15. @Autowired
      16. private Environment env;
      17. @Autowired
      18. private Person person;
      19. @RequestMapping("/hello")
      20. public String hello(){
      21. System.out.println(name);
      22. System.out.println(name2);
      23. System.out.println(age);
      24. System.out.println(address1);
      25. System.out.println(msg1);
      26. System.out.println(msg2);
      27. System.out.println("-----------------");
      28. System.out.println(env.getProperty("person.name"));
      29. System.out.println(env.getProperty("address[0]"));
      30. System.out.println("-----------------");
      31. System.out.println(person);
      32. String[] address = person.getAddress();
      33. for(String s : address){
      34. System.out.println(s);
      35. }
      36. return "hello SpringBoot";
      37. }
      38. }
    • profile

    • 我们在开发Spring Boot应用时,通常同一套程序会被安装到不同环境
    • 比如:开发、测试、生产等
    • 其中数据库地址、服务器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦
    • profile功能就是来进行动态配置切换的
    • (1)profile配置方式
      • 多profile文件方式
      • yml多文档方式
    • (2)profile激活方式
      • 配置文件
      • 虚拟机参数
      • 命令行参数
    • Profile-小结

    • (1)profile是用来完成不同环境下,配置动态切换功能的
    • (2)profile配置方式
      • 多profile文件方式:提供多个配置文件,每个代表一种环境
        • application-dev.properties/yml 开发环境
        • application-test.properties/yml 测试环境
        • application-pro.properties/yml 生产环境
      • yml多文档方式:
        • 在yml中使用---分隔不同配置
    • (3)profile激活方式
      • 配置文件:在配置文件中配置:spring.profiles.active=dev
      • 虚拟机参数:在VM options指定:-Dspring.profiles.active=dev
      • 命令行参数:java-jar xxx.jar --spring.profiles.active=dev
    • 内部配置加载顺序

    • Springboot程序启动时,会从以下位置加载配置文件:
    • 1.file:./config/:
    • 当前项目下的/config目录下
    • 2.file:./:
    • 当前项目的根目录
    • 3.classpath:/config/:
    • classpath的/config目录
    • 4.classpath:/:
    • classpath的根目录
    • 加载顺序为上文的排列顺序,高优先级配置的属性会生效
    • 外部配置加载顺序

    • 以下优先级从高到低,高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置
    • 1-命令行参数:所有的配置都可以在命令行上进行指定;
    • 2-来自java:comp/env的JNDI属性;
    • 3-Java系统属性(System.getProperties());
    • 4-操作系统环境变量 ;
    • 5-jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
    • 6-jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件 再来加载不带profile
    • 7-jar包外部的application.properties或application.yml(不带spring.profile)配置文件
    • 8-jar包内部的application.properties或application.yml(不带spring.profile)配置文件
    • 9-@Configuration注解类上的@PropertySource
    • 根据第7条,我们只要在jar包同目录外放置一个application.properties配置文件,就会起作用,同时这个配置文件的优先级还比jar内的高,这个配置很有作用
  • 相关阅读:
    乱打日志的男孩运气怎么样我不知道,加班肯定很多
    MongoDB的搭建 和crud操作
    Android中简单使用aspectj
    VPS8505 微功率隔离电源专用芯片2.3-6VIN/24V/1A 功率管 替代金升阳模块
    php快速排序法
    3.3 DLL注入:突破会话0强力注入
    中兴面试-Java开发
    软件工程师与软件开发区别? Software Engineer和Software Developer区别?
    NLP之多循环神经网络情感分析
    【MySQL】深入理解MySQL索引优化器工作原理
  • 原文地址:https://blog.csdn.net/weixin_59624686/article/details/127899623