springboot:讀取application.yml檔案

迷茫中守候發表於2020-12-05

現在開發主要使用微服務框架springboot,在springboot中經常遇到讀取application.yml檔案的情形。

一、概述

開發過程中經常遇到要讀取application.yml檔案中的屬性值,本文總結幾種讀取的方式,供參考。

二、詳述

我這裡使用的是springboot-2.1.2.RELEASE版本,這裡使用的是application.properties的配置方式,和使用application.yml的方式是一樣的。下面是application.properties檔案的內容

cn.com.my.test1=test1
cn.com.my.test2=test2

1、@Value註解

 這種方式是spring最早提供的方式,通過@Value註解的方式,該註解用在屬性上,但是要求該屬性所在的類必須要被spring管理。

package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class TestController {

    @Value("${cn.com.my.test1}")
    private String test1;
    @Value("${cn.com.my.test2}")
    private String test2;

    @RequestMapping("/test1/test")
    @ResponseBody
    public String getTest(){
        return "hello:"+test1+",test2:"+test2;
    }

}

在標記有@Controller類中使用了帶有@Value註解的test1和test2的屬性,首先標記有@Controller註解便可以使該類被spring管理。其次,使用@Value標記了屬性,則可以獲得application.properties(application.yml)檔案中的屬性,這裡使用${cn.com.my.test1},屬性的名稱必須是全部的名稱,測試結果如下,

2、@ConfigurationProperties

@ConfigurationProperties註解是springboot提供的,在springboot中大量使用,下面看其用法,

使用@Component註解

這裡需要定義一個類,

package com.example.demo.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "cn.com.my")
public class ApplicationPro {
    private String test1;
    private String test2;
private String testName;
//必須有set方法 public void setTest1(String test1) { this.test1 = test1; } //必須有set方法 public void setTest2(String test2) { this.test2 = test2; } public String getTest1() { return test1; } public String getTest2() { return test2; }
public void setTestName(String testName) {
this.testName = testName;
}

public String getTestName() {
return testName;
}
}

該類上使用了@ConfigurationProperties註解,且配置了prefix屬性,指定了要獲取屬性的字首,這裡的字首是cn.com.my,在類中定義的屬性名最好和application.properties檔案中的一致,不過這種方式可以採用稀疏匹配,把application.properties修改為下面的內容,

cn.com.my.test1=test1
cn.com.my.test2=test2
cn.com.my.test-name="hello world"

另外,在ApplicationPro類上標記有@Component註解,標記該註解的意思是要把該類交給spring管理,也就是說要讓spring管理此類,其實也可以使用其他註解,如,@Service等

下面看測試類,

package com.example.demo.controller;

import com.example.demo.properties.ApplicationPro;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class TestController3 {
    @Autowired
    private ApplicationPro ap;
    @RequestMapping("test3/test")
    @ResponseBody
    public String getTest(){
        return ap.getTest1()+","+ap.getTest2()+","+ap.getTestName();
    }
}

看測試結果,

從上面的結果可以看出已經獲得了application.properties檔案中的值,並且獲得了test-name的值。具體匹配規則可以自行百度,這裡強烈建議配置檔案中的屬性和類中的保持一致。

使用@EnableConfigurationProperties註解

使用該註解在ApplicationPro類中便不需要使用@Component註解,

package com.example.demo.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

//@Component
@ConfigurationProperties(prefix = "cn.com.my")
public class ApplicationPro {
    private String test1;
    private String test2;
    private String testName;

    //必須有set方法
    public void setTest1(String test1) {
        this.test1 = test1;
    }

    //必須有set方法
    public void setTest2(String test2) {
        this.test2 = test2;
    }

    public String getTest1() {
        return test1;
    }

    public String getTest2() {
        return test2;
    }

    public void setTestName(String testName) {
        this.testName = testName;
    }

    public String getTestName() {
        return testName;
    }
}

再看啟動類,在啟動類上標記了@EnableConfigurationProperties({ApplicationPro.class}),也就是使@ConfigurationProperties註解生效,並標記了標有@ConfigurationProperties註解的類Application.class

package com.example.demo;

import com.example.demo.properties.ApplicationPro;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

@SpringBootApplication
@EnableConfigurationProperties({ApplicationPro.class})
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

下面看測試結果,

3、Environment物件

使用Environment物件,該物件是spring提供的一個物件,且是spring內部建立的物件,

package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class TestController2 {
    @Autowired
    private Environment environment;

    @RequestMapping("/test2/test")
    @ResponseBody
    public String getTest(){
        return "hello,"+environment.getProperty("cn.com.my.test1")+","+"test2:"+environment.getProperty("cn.com.my.test2");
    }
}

可以看到,可以直接注入該物件的例項,通過其getProperty方法獲得相應的屬性值。

三、總結

 本文總結了,在使用springboot的過程中獲取配置檔案中的幾種方式,

@Value

@ConfigurationProperties

Environment物件

 

有不當之處,歡迎指正,謝謝。

相關文章