1. 程式人生 > 實用技巧 >SpringBoot-03-配置之注入配置檔案

SpringBoot-03-配置之注入配置檔案

3.2 注入配置檔案

yaml更強大的地方在於,可以給實體類直接注入匹配值!

yaml注入配置檔案

  1. 在springboot專案中的resources目錄下新建application.yml

  2. 編寫一個實體類 Dog

    @Component
    public class Dog {
        private String name;
        private Integer age;
    }
    
  3. 思考:原來怎麼給bean注入屬性值,@Value

    @Component
    public class Dog {
        @Value("旺財")
        private String name;
        @Value("3")
        private Integer age;
    }
    
  4. 在SpringBoot的測試類下注入輸出

    @SpringBootTest
    class Springboot02ConfigApplicationTests {
    
        @Autowired
        private Dog dog;
    
        @Test
        void contextLoads() {
            System.out.println(dog);
        }
    
    }
    
  5. 再編寫一個複雜一點的實體類:Person類

    @Component
    public class Person {
        private String name;
        private Integer age;
        private boolean happy;
        private Date birth;
        private Map<String,Object> maps;
        private List<Object> lists;
        private Dog dog;
    }
    
  6. 使用yaml配置的方式進行注入,注意區別和優勢

    person:
      name: huba
      age: 22
      happy: false
      birth: 2020/8/11
      maps: {k1: v1,k2: v2}
      lists:
        -code
        -music
      dog:
        name: 旺財
        age: 3
    
  7. 我們現在來注入到類中

    @Component
    @ConfigurationProperties(prefix = "person")
    public class Person {
    	...
    }
    
  8. IDEA提示,springboot配置註解處理器沒有找到,我們可以檢視文件,找到一個依賴!

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-configuration-processor</artifactId>
    	<optional>true</optional>
    </dependency>
    
  9. 確認以上配置都ok之後,去測試類中測試一下

載入指定的配置檔案

@PropertySource:載入指定的配置檔案

@ConfigurationProperties:預設從全域性配置檔案中獲取值;

  1. 在resources下新建一個person.properties

    name=huba
    
  2. 在實體類上指定載入person.properties檔案

    @PropertySource(value="classpath:person.properties")
    
    //    EL表示式取值
        @Value("${name}")
    
  3. 輸出測試:指定配置檔案繫結成功!

配置檔案佔位符

配置檔案還可以編寫佔位符生成隨機數

person:
  name: huba${random.uuid}
  age: ${random.int}
  happy: false
  birth: 2020/8/11
  maps: {k1: v1,k2: v2}
  lists:
    -code
    -music
  dog:
    name: ${person.hello:huba}_旺財
    age: 3

測試輸出結果:

對比小結

  1. @Configuration只需要寫一次即可,@Value則每個欄位都需要;
  2. 鬆散繫結:yml中的last-name,這個和lastName是等價的,-後面的字母預設是大寫的;
  3. JSR303資料校驗,它就是在欄位增加一層過濾器驗證,可以保證資料的合法性;
  4. 複雜型別封裝,yml可以封裝物件;

結論:

  • 推薦yml
  • 如果只需要獲取配置檔案的某個值,可以使用@Value
  • 如果專門編寫一個JavaBean來和配置檔案一一對映,就直接@ConfigurationProperties,不要猶豫!