SpringBoot從配置文件中獲取屬性的四種方法總結(jié)
方式一: @Value
基本類型屬性注入,直接在字段上添加@Value("${xxx.xxx}")即可.注意這里用的是$,而不是#.@Value注入的屬性,一般其他屬性沒有關(guān)聯(lián)關(guān)系.
配置文件
user: name: Manaphy age: 19 sex: male
方式二: @ConfigurationProperties
配置文件
@RestController public class ConfigPropertiesController { @Value("${user.name}") private String name; @Value("${user.age}") private Integer age; @Value("${user.sex}") private String sex; @GetMapping("/user") public String getUser() { return "{name:" + name + ",age:" + age + ",sex:" + sex + "}"; } }
JavaBean
/** * 將配置文件中配置的每一個(gè)屬性的值,映射到這個(gè)組件中 * @ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置文件中相關(guān)的配置進(jìn)行綁定; * prefix = "person":配置文件中哪個(gè)下面的所有屬性進(jìn)行一一映射 * 只有這個(gè)組件是容器中的組件,才能容器提供的@ConfigurationProperties功能 */ @Component @ConfigurationProperties(prefix = "person") @Data public class Person { private String lastName; private Integer age; private Boolean boss; private Date birth; private Map<String, Object> maps; private List<Object> lists; private Dog dog; } @Data class Dog { private String name; private Integer age; }
Controller層
@RestController public class PersonController { @Autowired private Person person; @GetMapping("/person") public Person getPerson() { return person; } }
運(yùn)行結(jié)果如下
我們可以導(dǎo)入配置文件處理器,以后編寫配置就有提示了
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
@Value和@ConfigurationProperties比較
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的屬性 | 一個(gè)個(gè)指定 |
松散綁定(松散語法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303數(shù)據(jù)校驗(yàn) | 支持 | 不支持 |
復(fù)雜類型封裝 | 支持 | 不支持 |
配置文件yml還是properties他們都能獲取到值;
如果說,我們只是在某個(gè)業(yè)務(wù)邏輯中需要獲取一下配置文件中的某項(xiàng)值,使用@Value;
如果說,我們專門編寫了一個(gè)javaBean來和配置文件進(jìn)行映射,我們就直接使用@ConfigurationProperties;
方式三: @PropertySource
配置文件
person.lastName=chen person.age=22 person.boss=false person.birth=2017/12/12 person.map1.k1=v1 person.map1.k2=v2 person.map2[k1]=v1 person.map2[k2]=v2 person.list[0]=zhang person.list[1]=wang person.list2=zhao,qian,sun,li person.dog.name=小狗 person.dog.age=12
JavaBean
@Component @ConfigurationProperties(prefix = "person") //如果只有一個(gè)主配置類文件,@PropertySource可以不寫 @PropertySource("classpath:person.properties") @Data public class Person { private String lastName; private Integer age; private Boolean boss; private Date birth; private Map<String, Object> map1; private Map<String, Object> map2; private List<Object> list; private List<Object> list2; private Dog dog; } @Data class Dog { private String name; private Integer age; }
測試同方式二
方式四: 使用工具類 無需注入獲取.yml中的值
新建 BeanConfiguration 類,用于項(xiàng)目啟動(dòng)構(gòu)造我們的工具類
@Configuration @Slf4j public class BeanConfiguration { @Bean public YamlConfigurerUtil ymlConfigurerUtil() { //1:加載配置文件 Resource app = new ClassPathResource("application.yml"); Resource appDev = new ClassPathResource("application-dev.yml"); Resource appProd = new ClassPathResource("application-prod.yml"); YamlPropertiesFactoryBean yamlPropertiesFactoryBean = new YamlPropertiesFactoryBean(); // 2:將加載的配置文件交給 YamlPropertiesFactoryBean yamlPropertiesFactoryBean.setResources(app); // 3:將yml轉(zhuǎn)換成 key:val Properties properties = yamlPropertiesFactoryBean.getObject(); String active = null; if (properties != null) { active = properties.getProperty("spring.profiles.active"); } if (StringUtils.isEmpty(active)) { log.error("未找到spring.profiles.active配置!"); } else { //判斷當(dāng)前配置是什么環(huán)境 if ("dev".equals(active)) { yamlPropertiesFactoryBean.setResources(app, appDev); } else if ("prod".equals(active)) { yamlPropertiesFactoryBean.setResources(app, appProd); } } // 4: 將Properties 通過構(gòu)造方法交給我們寫的工具類 return new YamlConfigurerUtil(yamlPropertiesFactoryBean.getObject()); } }
工具類實(shí)現(xiàn)
public class YamlConfigurerUtil { ? ? private static Properties ymlProperties = new Properties(); ? ? public YamlConfigurerUtil(Properties properties) { ? ? ? ? ymlProperties = properties; ? ? } ? ? public static String getStrYmlVal(String key) { ? ? ? ? return ymlProperties.getProperty(key); ? ? } ? ? public static Integer getIntegerYmlVal(String key) { ? ? ? ? return Integer.valueOf(ymlProperties.getProperty(key)); ? ? } }
調(diào)用示例
@RestController public class PersonController { ? ? @GetMapping("/msg") ? ? public String getMessage() { ? ? ? ? return YamlConfigurerUtil.getStrYmlVal("person.lastName"); ? ? } }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
WebUploader客戶端批量上傳圖片 后臺(tái)使用springMVC
這篇文章主要為大家詳細(xì)介紹了WebUploader客戶端批量上傳圖片,后臺(tái)使用springMVC接收實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09java線程Thread.sleep()對(duì)比對(duì)象的wait示例解析
這篇文章主要為大家介紹了java線程Thread.sleep()對(duì)比對(duì)象的wait示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09解決2022.3.1版本中?IDEA中?XML文件提示屎黃色背景的方法
這篇文章主要介紹了解決2022.3.1版本中?IDEA中?XML文件屎黃色背景?的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01Josephus環(huán)的四種解法(約瑟夫環(huán))基于java詳解
這篇文章主要介紹了Josephus環(huán)的四種解法(約瑟夫環(huán))基于java詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09String StringBuilder StringBuffer區(qū)別以及源碼分析
string是C++標(biāo)準(zhǔn)庫的一個(gè)重要的部分,主要用于字符串處理??梢允褂幂斎胼敵隽鞣绞街苯舆M(jìn)行string操作,同時(shí),C++的算法庫對(duì)string類也有著很好的支持,并且string類還和c語言的字符串之間有著良好的接口2021-06-06MySQL?MyBatis?默認(rèn)插入當(dāng)前時(shí)間方式
這篇文章主要介紹了MySQL?MyBatis?默認(rèn)插入當(dāng)前時(shí)間方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10Java 數(shù)據(jù)結(jié)構(gòu)進(jìn)階二叉樹題集上
二叉樹可以簡單理解為對(duì)于一個(gè)節(jié)點(diǎn)來說,最多擁有一個(gè)上級(jí)節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級(jí)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將帶你通過實(shí)際題目來熟練掌握2022-04-04SpringCloud項(xiàng)目中Feign組件添加請(qǐng)求頭所遇到的坑及解決
這篇文章主要介紹了SpringCloud項(xiàng)目中Feign組件添加請(qǐng)求頭所遇到的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04