首頁 > 軟體

Spring Boot 如何正確讀取組態檔屬性

2022-04-20 19:00:28

前言

專案中經常會經常讀取組態檔中的屬性的值,Spring Boot提供了很多註解讀取組態檔屬性,那麼如何正確使用呢?

@Value

@Value用來讀取application.yml組態檔中屬性的值。

範例程式碼

application.yml檔案中屬性:

//定義屬性
fileName : test
isFile : false
filePath : c://test

@value讀取application.yml屬性值:

@Configuration
public class FileConfig
{
    @Value("${fileName}")
    private final String fileName;
    @Value("${isFile}")
    private boolean isFile;
    @Value("${filePath}")
    private static String filePath;
}

測試:

 @Autowired
    private FileConfig fileConfig;
    @GetMapping("getFileConfig")
    public void getFileConfig()
    {
        logger.info("fileConfig:{}",fileConfig);
    }

執行結果:

fileConfig:FileConfig [fileName=, isFile=false, filePath=null]

特別注意:

  • @Value不能將屬性值讀取靜態變數,否則讀取的值為空。
  • @Value不能將屬性值讀取常數,否則讀取的值為空。
  • @Value不能讀取boolean型別的值,經過測試Spring Boot2.1的版本是無效的,2.2以上版本支援。

所以個人建議非必要情況,儘量少用@Value註解讀取屬性值。

@ConfigurationProperties

讀取組態檔值並且轉換成類物件,便於獲取值和修改屬性值。

範例程式碼

application.yml檔案中屬性:

http:
  pool:
    # 連線超時
    connectTimeout: 5000
    #獲取連線池中連線超時
    connectionRequestTimeout: 1000
    #每個路由連線數量
    defaultMaxPerRoute: 50
    # /連線池中最大連線數
    maxTotal: 50
    # 伺服器返回資料(response)的時間
    socketTimeout: 5000
    #定義不活動的時間(以毫秒為單位),連線回收
    validateAfterInactivity: 30000      

@ConfigurationProperties讀取application.yml中以http.pool開頭的屬性值:

//以http.pool開頭
@Component
@ConfigurationProperties(prefix = "http.pool")
public class HttpClientConfig implements Serializable
{
    private static final long serialVersionUID = -4608251658338406043L;
    /**
     * 最大連線數
     */
    private Integer maxTotal;
    /**
     * 路由是對最大連線數的細分
     * 每個路由基礎的連線數
     */
    private Integer defaultMaxPerRoute;
    /**
     * 連線超時時間
     */
    private Integer connectTimeout;
    /**
     * 從連線池中獲取連線的超時時間
     */
    private Integer connectionRequestTimeout;
    /**
     * 伺服器返回資料(response)的時間
     */
    private Integer socketTimeout;

測試:

  @GetMapping("getHttpClientConfig")
    public void getHttpClientConfig()
    {
        String json=FastJsonUtil.toJSONString(httpClientConfig);
        logger.info("fileConfig:{}",json);
    }

屬性巢狀:

@ConfigurationProperties 可以巢狀List、map、class

config:
  url:http://localhsot:8080
  gaode-map:
    host: https://restapi.amap.com/v3
    key: 1234
@ConfigurationProperties(prefix="config")
public class Config
{
    //高德地圖資訊
    private GaodeMap gaodeMap;
 }

特別注意:

  • 預設情況不會將實體注入到spring的容器中,需要結合@EnableConfigurationProperties或者@Component一起使用,否則注入物件為空。

@EnableConfigurationProperties

@ConfigurationProperties讀取物件注入到spring容器中。例如上述範例也可以採用@EnableConfigurationProperties 來注入

@EnableConfigurationProperties(HttpClientConfig.class)
public class FileController
{
    private Logger logger = LoggerFactory.getLogger(FileController.class);
    @Autowired
    private FileConfig fileConfig;
    @GetMapping("getHttpClientConfig")
    public void getHttpClientConfig()
    {
        String json=FastJsonUtil.toJSONString(httpClientConfig);
        logger.info("fileConfig:{}",json);
    }
  }

@ConfigurationPropertiesScan

用來掃描@ConfigurationProperties實體類並將類注入到Spring容器,上述範例可以如下使用

@ConfigurationPropertiesScan("com.xx.fw.config")
public class FwCoreApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(FwCoreApplication.class, args);
    }
}

@PropertySource

@PropertySource 主要用於讀取指定的組態檔,需要結合@ConfigurationProperties 註解一起使用實現組態檔和Java Bean的注入操作。

範例程式碼

屬性檔案user.properteis:

user.id=222
user.name=劍聖
user.age=28

實體類定義:

@Component
@ConfigurationProperties(prefix = "user")
@PropertySource(value = {"classpath:user.properties"})
public class UserConfig 
{
    private String id;
    private String name;
    private int age;
 }

測試:

    @GetMapping("getUserConfig")
    public void getUserConfig()
    {
        String json=FastJsonUtil.toJSONString(userConfig);
        logger.info("userConfig:{}",json);
    }

輸出結果:

c.s.fw.controller.FileController - userConfig:{"age":28,"id":"123","name":"admin"}

總結

重點講解了通過各種註解讀取組態檔種屬性值,每種方式都是各自的優缺點,專案中一定要統一規範使用,便於專案維護和排查問題。

到此這篇關於Spring Boot 如何正確讀取組態檔屬性的文章就介紹到這了,更多相關Spring Boot 讀取檔案屬性內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com