目录
  • 配置绑定
    • 先建立数据配置文件
    • application.yml
    • @ConfigurationProperties
    • @Value
      • 第一种 @Value(“${}”)
      • 第二种@Value(“#{}”)
    • @PropertySource
      • 配置属性校验
        • @Value 与 @ConfigurationProperties对比
          • 1. 使用位置不同
          • 2. 功能不同
          • 3. 松散绑定支持不同
          • 4. SpEL 支持不同
          • 5. 复杂类型封装
          • 6.属性校验
          • 7. 应用场景不同

      配置绑定

      所谓配置绑定”就是把配置文件中的值与 JavaBean 中对应的属性进行绑定。通常,我们会把一些配置信息(例如,数据库配置)放在配置文件中,然后通过 Java 代码去读取该配置文件,并且把配置文件中指定的配置封装到 JavaBean(实体类) 中。
      SpringBoot 提供了以下 2 种方式进行配置绑定:

      • 使用 @ConfigurationProperties 注解
      • 使用 @Value 注解

      先建立数据配置文件

      application.yml

      sb:
        port: 8086
        username: 'abc \n hello' #字符串 
        password: 6564321 #字符串 
        birthday: 2011/12/23 #日期 
        books: #map 
          jsp: 36 
          html: 78 
          spring: 78 
        books2: {jsp: 56,spring: 65,mybatis: 98} #map 行内 
        person: #javabean 
          name: abc 
          age: 23 
        person2: {name: lily, age: 36 } #javabean行内 
        hobby: #数组 
          - jsp 
          - hibernate 
          - spring 
          - mybatis 
        list: # list集合 
          - 32 
          - 65
          - 98 
        set: #set 集合 
          - hello 
          - world 
        hobby2: [23,45,56] #数组 list set 行内 
        mapList: # 数组 list set 里存map 
          - jsp: 36 
            hibernate: 58 
          - html: 65 
            css: 98 
            js: 65
          - {vue: 36,react: 98}
      

      @ConfigurationProperties

      通过 Spring Boot 提供的 @ConfigurationProperties 注解,可以将全局配置文件中的配置数据绑定到 JavaBean 中。
      DbConfig.java

      @Configuration 
      @ConfigurationProperties(prefix = "sb") 
      public class DbConfig { 
      String username; 
      String password; 
      Date birthday;
      Map books;
      Person person;
      Map books2;
      Person person2;
      String [] hobby;
      List list;
      Set set ;
      int [] hobby2;
      List<Map> mapList;
             /************省略geter/seter方法*************/ 
             }
      

      只有在容器中的组件,才会拥有 SpringBoot 提供的强大功能。如
      果我们想要使用 @ConfigurationProperties 注解进行配置绑定,
      那么首先就要保证该对 JavaBean 对象在 IoC 容器中,所以需要用
      到 @Configuration 注解来添加组件到容器中。
      JavaBean 上使用了注解 @ConfigurationProperties(prefix = “sb”)
      ,它表示将这个 JavaBean 中的所有属性与配置文件中以“sb”为前
      缀的配置进行绑定。

      @Value

      @Value的作用是通过注解将常量、配置文件中的值、其他bean的属性值注入到变量中,作为变量的初始值。 @Value的值有两类:
      ① ${property : default_value }
      ② #{ obj.property? :default_value }
      第一个注入的是外部配置文件对应的property,第二个则是SpEL表达式对应的内容。
      default_value,就是前面的值为空时的默认值。注意二者的不同,#{}里面那个obj代表对象。

      也就是说@Value注解有两种用法,一种是@Value(“${}”)和@Value(“#{}”),搞清楚分类后我们一一来分析。

      第一种 @Value(“${}”)

      controller层代码:

      @RestController
      @RequestMapping("/test")
      public class ValueController {
          @Autowired
          private CarpollingService carpollingService;
          @GetMapping("/getValue")
          public String getValue(){
              return carpollingService.getValue();
          }
      }

      配置类代码:

      @Configuration 
      public class CarpollingServiceImpl {
          @Value("${db.port}")
          private String port;
          @Override
          public String getValue() {
              return port;
          }
      }

      Spring boot配置绑定和配置属性校验的方式详解

      第二种@Value(“#{}”)

      注意: #{}是不能以第一种方式来进行取值,否则会报错

      前面已经说了,#{}里面包含的是obj,所以需要配合bean来使用,现在创建一个UserBean,并且给某个字段加上@Value(“#{}”)注解(按自己的需求任意添加注解)

      UserBean类代码:

      @Data
      @Component//添加component注解,使其注册进容器,交由容器进行管理
      public class UserBean {
          private String name="张三";}

      controller层代码:

      @RestController
      @RequestMapping("/test")
      public class ValueController {
             @Autowired
          CarpollingServiceImpl carpollingService;
          @GetMapping("/getValue")
          public String getValue(){
              return carpollingService.getValue();
          }
      }

      配置类代码:

      @Configuration
      public class CarpollingServiceImpl {
          @Value("#{userBean.name}")
          private String port;
          public String getValue() {
              return port;
          }
      }

      Spring boot配置绑定和配置属性校验的方式详解

      @PropertySource

      如果将所有的配置都集中到 application.properties 或 application.yml
      中,那么这个配置文件会十分的臃肿且难以维护,因此我们通常会将与Spring Boot 无关的配置(例如自定义配置)提取出来,写在一个单独的配置文件中,并在对应的 JavaBean 上使用 @PropertySource 注解指向该配置文件。

      我们也可以自定义配置文件,例如新建 db.properties ,配置内容如下:

      pro.username=admin 
      pro.password=123456 
      pro.birthday=2000/12/01 
      pro.age=23 
      pro.books={jsp:36,html:360,spring:65} 
      pro.hobby=23,34 
      pro.list=sprig,myatis 

      配置类:

      @Component 
      @PropertySource("classpath:db.properties") 
      @Data 
      public class User {
       @Value("${pro.username}") 
       String username; 
       @Value("${pro.password}") 
       String password; 
       @Value("${pro.birthday}") 
       Date birthday;
       }

      注: 该注解只能引用properties文件

      配置属性校验

      自定义配置文件时,可以使用@Validated注解对注入的值进行一些简单的校验,示例代码:
      Testconfig.java

      @Validated
      @Configuration
      @ConfigurationProperties(prefix = "sb")
      public class Testconfig {
          @Max(value = 123)
          private String password;
          public String getPassword() {
              return password;
          }
          public void setPassword(String password) {
              this.password = password;
          }
      }

      测试

      Spring boot配置绑定和配置属性校验的方式详解

       @Autowired
          Testconfig testconfig;
          @Test
          void a() {
              System.out.println(testconfig.getPassword());
          }

      抛出错误,最大值不能超过123

      Spring boot配置绑定和配置属性校验的方式详解

      @Max(value = 123)注解会对注入的值进行校验,如果不是小于123的将会报错抛出
      其它常见注解:
      @AssertFalse 校验false
      @AssertTrue 校验true
      @DecimalMax(value=,inclusive=) 小于等于value,inclusive=true,
      是小于等于
      @DecimalMin(value=,inclusive=) 与上类似
      @Max(value=) 小于等于value
      @Min(value=) 大于等于value
      @NotNull 检查Null
      @Past 检查日期
      @Pattern(regex=,flag=) 正则
      @Size(min=, max=) 字符串,集合,map限制大小
      @Validate 对po实体类进行校验

      上述的这些注解位于javax.validation.constraints包下, SpringBoot 2.3.0以后maven引用:

      <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-validation</artifactId> 
      </dependency>

      @Value 与 @ConfigurationProperties对比

      @Value 和 @ConfigurationProperties 注解都能读取配置文件中的属性值并绑定到 JavaBean 中,但两者存在以下不同。

      1. 使用位置不同

      • @ConfigurationProperties:标注在 JavaBean 的类名上;
      • @Value:标注在 JavaBean 的属性上。

      2. 功能不同

      • @ConfigurationProperties:用于批量绑定配置文件中的配置;
      • @Value:只能一个一个的指定需要绑定的配置。

      3. 松散绑定支持不同

      @ConfigurationProperties:支持松散绑定(松散语法),例如实体类Person 中有一个属性为 firstName,那么配置文件中的属性名支持以下写法:

      • person.firstName
      • person.first-name
      • person.first_name
      • PERSON_FIRST_NAME

      @Vaule:不支持松散绑定。

      4. SpEL 支持不同

      • @ConfigurationProperties:不支持 SpEL 表达式;
      • @Value:支持 SpEL 表达式。

      5. 复杂类型封装

      • @ConfigurationProperties:支持所有类型数据的封装,例如 Map、 List、Set、以及对象等;
      • @Value:支持基本数据类型的封装,例如字符串、布尔值、整数等类型, 对集合Map list set配置有要求

      6.属性校验

      • @Value不支持属性校验
      • @ConfigurationProperties 支持属性校验

      7. 应用场景不同

      @Value 和 @ConfigurationProperties 两个注解之间,并没有明显的优劣之分,它们只是适合的应用场景不同而已。

      • 若只是获取配置文件中的某项值,则推荐使用 @Value 注解;
      • 若专门编写了一个 JavaBean 来和配置文件进行映射,则建议使用 @ConfigurationProperties 注解。

      我们在选用时,根据实际应用场景选择合适的注解能达到事半功倍的效果

      声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。