SpringBoot中的配置文件

Java知识点总结:想看的可以从这里进入

1.5、配置文件

1.5.1、默认配置文件

SpringBoot是为了简化Spring的开发而产生的,但是它并非没有配置文件,配置文件的作用就是修改一些默认的配置值,SpringBoot会自动将这些值进行配置。

而 SpringBoot 默认使用以下 2 种默认的配置文件,且文件名是固定的:application.properties 、apllication.yml。

image-20220920101618281

  1. properties 文件我们已经使用过了,它是以 键=值 的形式保存数据

    jdbc.driver=com.mysql.cj.jdbc.Driver
    jdbc.url= jdbc:mysql://localhost:3360/库名
    jdbc.username=root
    jdbc.password=123456
    
  2. yml文件 是YAML 格式的语言,使用缩进表示层级关系,同级元素必须左侧对齐,上下级元素换行缩进,相对于properties 而言它结构更清晰也更简单。

    比如:我们使用YML文件配置数据库的连接,相对 properties 文件来说它具有阅读性更强的层级关系。

    #配置数据库连接
    jdbc:
    	driver: com.mysql.cj.jdbc.Driver
    	url: jdbc:mysql://localhost:3360/库名
    	username: root
    	password: 123456
    

Spring Boot 项目中可以存在多个 application.properties 或 apllication.yml。Spring Boot 启动时会扫描以下 5 个位置的 application.properties 或 apllication.yml 文件,并将它们作为 Spring boot 的默认配置文件。以下是按照优先级的顺序从高到低的加载顺序:

  1. file:./config/*/
  2. file:./config/
  3. file:./
  4. classpath:/config/
  5. classpath:/
1.5.2、YAML 语法

YAML文件是SpringBoot支持的配置文件的一种,且是SpringBoot 推荐使用的。

YAML 全称 YAML Ain’t Markup Language,它是一种以数据为中心的标记语言(以 .yml 或 .yaml 结尾),Spring Boot 中的 spring-boot-starter-web 或 spring-boot-starter 都对 SnakeYAML 库做了集成, 只要项目中引用了这两个 Starter 中的任何一个,Spring Boot 会自动添加 SnakeYAML 库到 classpath 下。

  • YAML 的语法如下:

    • 使用缩进表示层级关系,同级元素必须左侧对齐,上下级元素换行缩进。

    • #表示注释

    • 键和值用 :分开,且在 :后值前需要添加一个空格,这个空格是不能省略的 k:(空格)v

    • 属性和值的大小写都敏感。

    • 字符串默认不用加上单引号或者双引号;

      加上 “”:双引号;不会转义字符串里面的特殊字符。“张三\n 李四”:输出;张三 (换行) 李四

      加上 ‘’:单引号;会转义特殊字符,‘张三\n 李四’:输出;张三 \n 李四

  • YAML支持的数据结构:

    • 对象:

      # 对象
      student1:
        name: 张三
        age: 18
      #对象的行内写法
      student2: {name: 张三,age: 18}
      
    • 数组、集合:内部元素以 - 开头

      #数组
      name1:
        - java
        - vue
        - springboot
      #数组行内写法
      name2: [java,vue,springboot]
      
    • 字面量:字符串、布尔值、整数、浮点数、null、时间、日期

      boolean: 
          - TRUE
          - FALSE
      float:
          - 3.14
          - 6.8523015e+5  #可以使用科学计数法
      int:
          - 123
          - 0b1010_0111_0100_1010_1110    #二进制表示
      null:
          nodeName: 'node'
          parent: ~  #使用~表示null
      string:
          - 哈哈
          - 'Hello world'  #可以使用双引号或者单引号包裹特殊字符
          - newline
            newline2    #字符串可以拆成多行,每一行会被转化成一个空格
      date:
          - 2035-02-17    #日期必须使用ISO 8601格式,即yyyy-MM-dd
      datetime: 
          -  2099-02-17T15:02:31+08:00    #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
      
  • 引用:& 锚点和 * 别名

    defaults: &defaults
      adapter:  postgres
      host:     localhost
    
    development:
      database: myapp_development				
      <<: *defaults
    
    #相当于
    development:
      database: myapp_development
      adapter:  postgres
      host:     localhost
    
1.5.3、外部配置文件

Spring Boot 除了默认配置文件外还可以加载一些项目外的配置文件(也是yml、properties文件)。我们可以通过 2 个参数,指定外部配置文件的路径:

  • spring.config.location =xxx.yml/properties:使项目原本的配置文件失效。
  • spring.config.additional-location =xxx.yml/properties:不会使项目内置的配置文件失效,两者会互补,但是additional-location配置的文件优先级更高。

首先使用 Maven 命令 package进行打包处理,完成后会出现文件 springbootpoject-0.0.1-SNAPSHOT.jar

image-20220919121737411

打开cmd命令行,跳转到此文件所在的文件夹后,执行命令即可使用外部的配置:

java -jar springbootpoject-0.0.1-SNAPSHOT.jar --spring.config.location=application.properties的位置

java -jar springbootpoject-0.0.1-SNAPSHOT.jar --spring.config.additional-location =xxx.yml/properties的位置

1.5.4、配置数据绑定

所谓 配置绑定 就是把配置文件中的值与 Bean 中对应的属性进行绑定。

以yml文件为例,设置属性

person:
  name: 张三
  age: 22
  list:
    - java
    - python
  deleted: true

SpringBoot 提供了以下 2 种方式进行配置绑定:

  • 使用 @ConfigurationProperties 注解

    <!-- 配置注解处理器:@ConfigurationProperties:添加配置注解处理器后可用  -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    
    @Component
    @ConfigurationProperties(prefix = "person")
    @Data
    public class Person {
        private String name;
        private int age ;
        private List<String> list;
        private boolean deleted;
    }
    
    @Resource
    private Person person;
    
    @Test
    public void test(){
        System.out.println(person.toString());
    }
    

  • 使用 @Value 注解

    @Data
    @Component
    public class Person {
        @Value("${person.name}")
        private String name;
    
        @Value("${person.age}")
        private int age ;
    
    	//不支持list
        private List<String> list;
    
        @Value("${person.deleted}")
        private boolean deleted;
    }
    

    image-20230307172317864

这两者都是配置绑定的,但是它们也有不同之处(如果只是获取单个值则使用@Value,如果有专门的JavaBean对应则使用@ConfigurationProperties):

@ConfigurationProperties@Value
使用位置用在类上,指定配置文件中的对象名,批量注入相关属性用在属性上,一个个的指定
松散绑定支持不支持
EL表达式不支持支持
数据类型支持所有类型数据的封装只支持基本数据类型的封装
JSR303数据验证支持不支持
1.5.5、JSR303数据验证

JSR303数据验证:是JavaEE6的提出的一项规范,叫做 Bean Validation,专门用于参数的效验。

<!--JSR303数据验证-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
  1. @Null:带注释的元素必须为null
  2. @NotNull:带注释的元素不能为null
  3. @NotBlank:只用于String类型上,检查字符串不能为null ,并且必须至少包含一个非空白字符。
  4. @NotEmpty:带注释的元素不得为null或为空。
  5. @AssertTrue :验证 Boolean 对象是否为 true
  6. @AssertFalse:验证 Boolean 对象是否为 false
  7. @Past:验证 Date 和 Calendar 对象是否在当前时间之前
  8. @Future:验证 Date 和 Calendar 对象是否在当前时间之后
  9. @Pattern:验证 String 对象是否符合正则表达式的规则
  10. @Size:带注释的元素大小必须在指定边界(包括)之间。
  11. @Length:检查String对象的大小是否在指定的范围内
  12. @Email:该字符串必须是格式正确的电子邮件地址。
  13. @Min:带注释的元素必须是一个数字,其值必须大于或等于指定的最大值。
  14. @Max:带注释的元素必须是一个数字,其值必须小于或等于指定的最大值。
  15. @Digits:带注释的元素必须是可接受范围内的数字。
  16. @Positive:注释元素必须是一个严格的正数(即 0 被视为无效值)。
  17. @PositiveOrZero:带注释的元素必须是正数或 0。
1.5.7、导入Spring配置

SpringBoot的配置名字格式都是固定的,即使我们添加Spring的配置文件 ,也不会被识别,SpringBoot为了加载Spring的配置文件给了两个方式:@ImportResource注解、全注解的方式(@Configuration+ @Bean)。

  • 在启动类上使用 @ImportResource 注解加载 Spring 配置文件

    创建一个Spring.xml文件,配置一个Bean测试。

    <bean id="person" class="com.yu.springbootpoject.pojo.Person">
        <property name="name" value="张三"/>
        <property name="age" value="22"/>
        <property name="list">
            <list>
                <value>spring</value>
                <value>springboot</value>
            </list>
        </property>
        <property name="delete" value="true"/>
    </bean>
    
    //将 springxml 加载到项目中
    @ImportResource(locations = {"classpath:/spring.xml"})
    @SpringBootApplication
    public class SpringbootApplication {
        public static void main(String[] args) {
            SpringApplication.run(HelloworldApplication.class, args);
        }
    }
    

    image-20220919131228369

  • 通过Spring提供的代替XML文件的一些注解实现(SpringBoot是推荐使用这种方式的)

    @Configuration
    public class SpringConfig {
        @Bean
        public Person person(){
            List<String> strings = new ArrayList<>();
            strings.add("java");
            strings.add("python");
            Person person = new Person();
            person.setName("张三");
            person.setAge(22);
            person.setList(strings);
            person.setDelete(true);
    
            return person;
        }
    }
    

    image-20220919131847339

1.5.6、配置优先级
  • 通过命令行参数加载的配置优先级最高,
  • 来自java:comp/env的JNDI属性:是一组在Java应用中访问命名和目录服务的 API
  • Java系统属性(System.getProperties());
  • 操作系统环境变量
  • 外部配置文件(带spring.profile)
  • 内部配置文件(带spring.profile)
  • 外部配置文件(不带spring.profile)
  • 内部配置文件(不带spring.profile)
  • @Configuration注解类上的@PropertySource
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰 羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值