springboot-配置文件的注入

本文標識 : Jsbt0007

本文編輯 : Jack 風

編程工具 : IDEA

閱讀時長 : 5分鐘


title: springboot-08配置文件的注入


::: tip 配置文件值的注入

單值注入和批量注入

:::

1、單值注入

使用@Value註解注入單個屬性的值

  • yml配置文件
person:    name: "zhangsan n  lisi"    age: 23    boss: true    birth: 2019/11/21
  • java代碼
//datasource.properties 數據源的配置文件  //<bean ..> <property name="url" value="${url}"></property> </bean>    @Value("${person.name}")  private String name;

${key} :來引用屬性文件中key對應的值

2、批量注入

使用@ConfigurationProperties註解批量注入配置文件中的多個值

配置文件

person:    lastName: 年少風    age: 18    boss: false    birth: 2019/11/20    maps: {k1: v1, k2: 12}    lists:    - 張三    - 李四    dog:      name: 哈士奇      age: 2

@Data是一個lomlok插件,免去了getter/setter和toString這些繁瑣的東西

在POM文件的節點中間添加

<dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>1.18.4</version>    <scope>provided</scope>  </dependency>
//封裝配置文件中person中的數據  @ConfigurationProperties(prefix = "person")  @Component  @Data  public class Person {      private String lastName;      private Integer age;      private Boolean boss;      private Date birth;      private Map<String,Object> maps;      private List<String> lists;      private Dog dog;  }

使用@ConfigurationProperties註解必須同時添加@Component講當前的配置類放入IOC容器中

@Data  public class Dog {      private String name;      private Integer age;  }
  • 測試代碼
@RestController  public class HelloController {        Logger log = LoggerFactory.getLogger(HelloController.class);        @Autowired      private Person person;        @GetMapping("/hello")      public String hello(){          log.info(person.toString());          return "hello SpringBoot-swagger";      }  }
  • 控制台的輸出
Person(lastName=年少風, age=18, boss=false, birth=Tue Nov 12 00:00:00 CST 2019, maps={k1=v1, k2=12}, lists=[張三, 李四], dog=Dog(name=哈士奇, age=2))

javaBean:

  • 將配置文件中配置的每一個屬性的值,映射到這個組件中
  • @ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定;
  • prefix = "person":配置文件中哪個下面的所有屬性進行一一映射
  • 只有這個組件是容器中的組件,才能使用容器提供的@ConfigurationProperties功能;
  • @Data是一個插件,,免去了getter/setter和toString這些繁瑣的東西

如果在編寫yml文件的時候沒有出現屬性提示:

我們可以導入配置文件處理器,以後編寫配置就有提示了

<!--導入配置文件處理器,配置文件進行綁定就會有提示-->  <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-configuration-processor</artifactId>      <optional>true</optional>  </dependency>

3、兩種注入的區別

@Value獲取值和@ConfigurationProperties獲取值的區別

@ConfigurationProperties

@Value

功能

批量注入配置文件中的屬性

一個個指定

鬆散綁定(鬆散語法)

支持

不支持

SpEL:##{}

不支持

支持

JSR303數據校驗

支持

不支持

複雜類型封裝

支持

不支持

鬆散語法綁定:last_name = last-name = lastName 他們取的值都是相同的

配置文件yml還是properties他們都能獲取到值;

總結:

  • 如果說,我們只是在某個業務邏輯中需要獲取一下配置文件中的某項值,使用@Value;
  • 如果說,我們專門編寫了一個javaBean來和配置文件進行映射,我們就直接使用@ConfigurationProperties;

4、注入值的數據校驗

@ConfigurationProperties(prefix = "person")  @Component  @Data  @Validated //數據校驗  public class Person {        @Email(message = "用戶名必須是一個正確的郵箱格式")      private String lastName;      @Max(value = 200,message = "年齡不能超過200歲")      @Min(value = 0,message = "年齡必須大於0歲")      private Integer age;      private Boolean boss;      private Date birth;      private Map<String,Object> maps;      private List<String> lists;      private Dog dog;    }

經過剛才的測試得出,兩個註解不能同時作用在一個屬性上。