springboot項目中PropertySource如何讀取yaml配置文件
PropertySource如何讀取yaml配置文件
springboot項目中,當我們使用@Value注解讀取配置屬性,默認的配置文件是properties類型文件,如果一些配置來自yaml格式配置文件,那么就需要做一個配置。
PropertySource注解提供了factory屬性,可以設置yaml格式文件加載工廠類。
下面介紹如何自定義factory實現(xiàn)yaml配置文件加載。
項目準備
maven工程pom.xml增加spring-boot-starter-web依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
自定義YamlPropertySourceFactory
package com.xxx.web.config; import org.springframework.boot.env.YamlPropertySourceLoader; import org.springframework.core.env.PropertySource; import org.springframework.core.io.support.EncodedResource; import org.springframework.core.io.support.PropertySourceFactory; import java.io.IOException; import java.util.List; public class YamlPropertySourceFactory implements PropertySourceFactory { @Override public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException { List<PropertySource<?>> list = new YamlPropertySourceLoader().load(resource.getResource().getFilename(),resource.getResource()); if(list != null && list.size() > 0) return list.get(0); return null; } }
yml配置文件使用
package com.xxx.web.controller; import com.xxx.web.config.YamlPropertySourceFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.PropertySource; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; @RestController @RequestMapping("/test/v1") @PropertySource(value = {"file:conf/test.yml"},factory = YamlPropertySourceFactory.class) public class TestController { @Value("${business.errorCode}") private int errorCode; @Value("${business.msg}") private String msg; @Value("${business.data}") private String data; @RequestMapping(value = "/status",method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity queryStatus(){ Map<String,Object> result = new HashMap(){ { put("msg",msg); put("errorCode",errorCode); put("data",data); } }; return ResponseEntity.ok(result); } }
這里為了配合項目配置,配置文件放在工程根目錄下的conf/test.yml
business: errorCode: 2 msg: success, data: hallo
啟動項目,我們可以訪問地址http://localhost:8080/test/v1/status,可以看到,返回結果為配置文件中設置的值。
這里值得注意的是,@PropertySource在指定配置文件位置的時候,使用的是file,這種方式指定的路徑,是相對于項目根路徑來的,所以我們的配置文件沒有放在resources目錄下,
如果放在resources目錄下,要通過file訪問到,那么,位置需要設置成這樣:
@PropertySource(value={"file:src/main/resources/conf/test.yml"},factory=YamlPropertySourceFactory.class)
這里還可以通過classpath的方式來指定,如果conf/test.yml放在了resources類路徑下。
就可以這樣設置:
@PropertySource(value = {"classpath:conf/test.yml"},factory = YamlPropertySourceFactory.class)
注意兩種方式的區(qū)別,以及配置文件需要放置的位置。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Springboot中的@ConditionalOnBean注解詳細解讀
這篇文章主要介紹了Springboot中的@ConditionalOnBean注解詳細解讀,@ConditionalOnMissingBean注解兩個類,一個Computer類,一個配置類,想要完成;如果容器中沒有Computer類,就注入備用電腦Computer類,如果有Computer就不注入,需要的朋友可以參考下2023-11-11SpringBoot快速整合RabbitMq小案例(使用步驟)
這篇文章主要介紹了SpringBoot快速整合RabbitMq小案例,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06