日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Spring Boot讀取自定義配置文件

瀏覽:24日期:2023-07-13 10:10:39
目錄@Value@ConfigurationProperties顯式注入 Spring IoC@EnableConfigurationProperties@ConfigurationPropertiesScan@PropertySource注解使用EnvironmentPostProcessor加載自定義配置文件總結(jié)@Value

首先,會想到使用@Value注解,該注解只能去解析yaml文件中的簡單類型,并綁定到對象屬性中去。

felord: phone: 182******32 def: name: 碼農(nóng)小胖哥 blog: felord.cn we-chat: MSW_623 dev: name: 碼農(nóng)小胖哥 blog: felord.cn we-chat: MSW_623 type: JUEJIN

對于上面的yaml配置,如果我們使用@Value注解的話,冒號后面直接有值的key才能正確注入對應(yīng)的值。例如felord.phone我們可以通過@Value獲取,但是felord.def不行,因為felord.def后面沒有直接的值,它還有下一級選項。另外@Value不支持yaml松散綁定語法,也就是說felord.def.weChat獲取不到felord.def.we-chat的值。

@Value是通過使用Spring的SpEL表達(dá)式來獲取對應(yīng)的值的:

// 獲取 yaml 中 felord.phone的值 并提供默認(rèn)值 UNKNOWN@Value('${felord.phone:UNKNOWN}') private String phone;

@Value的使用場景是只需要獲取配置文件中的某項值的情況下,如果我們需要將一個系列的值進(jìn)行綁定注入就建議使用復(fù)雜對象的形式進(jìn)行注入了。

@ConfigurationProperties

@ConfigurationProperties注解提供了我們將多個配置選項注入復(fù)雜對象的能力。它要求我們指定配置的共同前綴。比如我們要綁定felord.def下的所有配置項:

package cn.felord.yaml.properties; import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties; import static cn.felord.yaml.properties.FelordDefProperties.PREFIX; /** * @author felord.cn */@Data@ConfigurationProperties(PREFIX)public class FelordDefProperties { static final String PREFIX = 'felord.def'; private String name; private String blog; private String weChat;}

我們注意到我們可以使用weChat接收we-chat的值,因為這種形式支持從駝峰camel-case到短橫分隔命名kebab-case的自動轉(zhuǎn)換。

如果我們使用@ConfigurationProperties的話建議配置類命名后綴為Properties,比如Redis的后綴就是RedisProperties,RabbitMQ的為RabbitProperties。

另外我們?nèi)绻脒M(jìn)行嵌套的話可以借助于@NestedConfigurationProperty注解實現(xiàn)。也可以借助于內(nèi)部類。這里用內(nèi)部類實現(xiàn)將開頭yaml中所有的屬性進(jìn)行注入:

package cn.felord.yaml.properties; import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties; import static cn.felord.yaml.properties.FelordProperties.PREFIX; /** * 內(nèi)部類和枚舉配置. * * @author felord.cn */@Data@ConfigurationProperties(PREFIX)public class FelordProperties { static final String PREFIX = 'felord'; private Def def; private Dev dev; private Type type; @Data public static class Def {private String name;private String blog;private String weChat; } @Data public static class Dev {private String name;private String blog;private String weChat; } public enum Type {JUEJIN,SF,OSC,CSDN }}

單獨使用@ConfigurationProperties的話依然無法直接使用配置對象FelordDefProperties,因為它并沒有被注冊為Spring Bean。我們可以通過兩種方式來使得它生效。

顯式注入 Spring IoC

你可以使用@Component、@Configuration等注解將FelordDefProperties注入Spring IoC使之生效。

package cn.felord.yaml.properties; import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component; import static cn.felord.yaml.properties.FelordDefProperties.PREFIX; /** * 顯式注入Spring IoC * @author felord.cn */@Data@Component@ConfigurationProperties(PREFIX)public class FelordDefProperties { static final String PREFIX = 'felord.def'; private String name; private String blog; private String weChat;}@EnableConfigurationProperties

我們還可以使用注解@EnableConfigurationProperties進(jìn)行注冊,這樣就不需要顯式聲明配置類為Spring Bean了。

package cn.felord.yaml.configuration; import cn.felord.yaml.properties.FelordDevProperties;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.annotation.Configuration; /** * 使用 {@link EnableConfigurationProperties} 注冊 {@link FelordDevProperties}使之生效 * @author felord.cn */@EnableConfigurationProperties({FelordDevProperties.class})@Configurationpublic class FelordConfiguration {}

該注解需要顯式的注冊對應(yīng)的配置類。

@ConfigurationPropertiesScan

在Spring Boot 2.2.0.RELEASE中提供了一個掃描注解@ConfigurationPropertiesScan。它可以掃描特定包下所有的被@ConfigurationProperties標(biāo)記的配置類,并將它們進(jìn)行IoC注入。

package cn.felord.yaml; import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.context.properties.ConfigurationPropertiesScan;import org.springframework.boot.context.properties.EnableConfigurationProperties; /** * {@link ConfigurationPropertiesScan} 同 {@link EnableConfigurationProperties} 二選一 * * @see cn.felord.yaml.configuration.FelordConfiguration * @author felord.cn */@ConfigurationPropertiesScan@SpringBootApplicationpublic class SpringBootYamlApplication { public static void main(String[] args) {SpringApplication.run(SpringBootYamlApplication.class, args); } }

這非常適合自動注入和批量注入配置類的場景,但是有版本限制,必須在2.2.0及以上。

@PropertySource注解

@PropertySource可以用來加載指定的配置文件,默認(rèn)它只能加載*.properties文件,不能加載諸如yaml等文件。

@PropertySource相關(guān)屬性介紹

value:指明加載配置文件的路徑。 ignoreResourceNotFound:指定的配置文件不存在是否報錯,默認(rèn)是false。當(dāng)設(shè)置為 true 時,若該文件不存在,程序不會報錯。實際項目開發(fā)中,最好設(shè)置 ignoreResourceNotFound 為 false。 encoding:指定讀取屬性文件所使用的編碼,我們通常使用的是UTF-8。

@Data@AllArgsConstructor@NoArgsConstructor@Builder@Configuration@PropertySource(value = {'classpath:common.properties'},ignoreResourceNotFound=false,encoding='UTF-8')@ConfigurationProperties(prefix = 'author')public class Author { private String name; private String job; private String sex;}

有小伙伴也許發(fā)現(xiàn)示例上的@ConfigurationProperties注解了。當(dāng)我們使用@Value需要注入的值較多時,代碼就會顯得冗余。我們可以使用@ConfigurationProperties 中的 prefix 用來指明我們配置文件中需要注入信息的前綴

前邊提到了用@PropertySource只能加載*.properties文件,但如果我們項目的配置文件不是*.properties這種類型,而是其他類型,諸如yaml,此時我們可以通過實現(xiàn)PropertySourceFactory接口,重寫createPropertySource方法,就能實現(xiàn)用@PropertySource也能加載yaml等類型文件。

public class YamlPropertySourceFactory implements PropertySourceFactory { @Override public PropertySource<?> createPropertySource(String sourceName, EncodedResource resource) throws IOException {Properties propertiesFromYaml = loadYaml(resource);if(StringUtils.isBlank(sourceName)){ sourceName = resource.getResource().getFilename();;}return new PropertiesPropertySource(sourceName, propertiesFromYaml); } private Properties loadYaml(EncodedResource resource) throws FileNotFoundException {try { YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); factory.setResources(resource.getResource()); factory.afterPropertiesSet(); return factory.getObject();} catch (IllegalStateException e) { // for ignoreResourceNotFound Throwable cause = e.getCause(); if (cause instanceof FileNotFoundException)throw (FileNotFoundException) e.getCause(); throw e;} }}

@Data@AllArgsConstructor@NoArgsConstructor@Builder@Configuration@PropertySource(factory = YamlPropertySourceFactory.class,value = {'classpath:user.yml'},ignoreResourceNotFound=false,encoding='UTF-8')@ConfigurationProperties(prefix = 'user')public class User { private String username; private String password;}使用EnvironmentPostProcessor加載自定義配置文件

1、實現(xiàn)EnvironmentPostProcessor接口,重寫postProcessEnvironment方法

@Slf4jpublic class CustomEnvironmentPostProcessor implements EnvironmentPostProcessor { @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {Properties properties = new Properties();try { properties.load(new InputStreamReader(CustomEnvironmentPostProcessor.class.getClassLoader().getResourceAsStream('custom.properties'),'UTF-8')); PropertiesPropertySource propertiesPropertySource = new PropertiesPropertySource('custom',properties); environment.getPropertySources().addLast(propertiesPropertySource);} catch (IOException e) { log.error(e.getMessage(),e);} }}

2、在META-INF下創(chuàng)建spring.factories

spring.factories文件內(nèi)容如下:org.springframework.boot.env.EnvironmentPostProcessor=com.github.lybgeek.env.CustomEnvironmentPostProcessor

1、2步驟實現(xiàn)完后,就可以在代碼中直接用@Value的方式獲取自定義配置文件內(nèi)容了

讀取的自定義配置文件內(nèi)容的實現(xiàn)方法有多種多樣,除了上面的方法,還可以在以-jar方式啟動時,執(zhí)行形如下命令

java -jar project.jar --spring.config.location=classpath:/config/custom.yml

也能實現(xiàn)。還可以干脆自定義配置文件都以application-*為前綴,比如application-custom,然后在application.properties,使用spring.profiles.include=custom或者spring.profiles.active=custom也可以實現(xiàn)

總結(jié)

日常開發(fā)中單個屬性推薦使用@Value,如果同一組屬性為多個則推薦@ConfigurationProperties。需要補(bǔ)充一點的是@ConfigurationProperties還支持使用 JSR303 進(jìn)行屬性校驗。好了今天的教程就到這里

相關(guān)的demo地址

https://gitee.com/felord/spring-boot-yml.git

https://github.com/lyb-geek/springboot-learning/tree/master/springboot-outside-config

以上就是Spring Boot讀取自定義配置文件的詳細(xì)內(nèi)容,更多關(guān)于Spring Boot讀取自定義配置文件的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
三上亚洲一区二区| 亚洲va中文在线播放免费| 亚洲天堂av影院| 成人精品国产亚洲| 久久天堂影院| 美女国产精品久久久| 国产日韩一区二区三区在线播放| 亚洲欧美激情诱惑| 美女网站一区| 欧美黄色网页| 欧美成a人免费观看久久| 久久久久观看| 久久uomeier| 欧美日韩国产免费观看 | 野花国产精品入口| 国产精品久久久久久久久久齐齐| 国产欧美日本| 裤袜国产欧美精品一区| 欧洲在线一区| 欧美日韩日本国产亚洲在线| 一本色道精品久久一区二区三区| 蜜桃视频第一区免费观看| 亚洲免费毛片| 奇米色欧美一区二区三区| 国产精品久久亚洲不卡| 亚洲爱爱视频| 亚洲日本久久| 精品国产网站| 亚洲中字黄色| 国产精品久久久久久久免费观看| 99久久夜色精品国产亚洲狼| 在线中文字幕播放| 国产精品久久久久久av公交车| 伊人久久亚洲影院| 美女av在线免费看| 久久av免费看| 国产日韩精品视频一区二区三区| 欧美成人久久| 欧产日产国产精品视频| 国产乱人伦丫前精品视频| 亚洲精品成人一区| 欧美中文日韩| 一区二区视频欧美| 不卡在线一区| 久久精品亚洲人成影院 | 国产精品手机在线播放| 久久亚洲美女| 中文视频一区| 蜜桃视频在线观看一区二区| 日韩欧美一区二区三区免费看| 国产精品亚洲综合在线观看| 99在线精品免费视频九九视| 欧美日韩国产在线一区| 中文日韩在线| 亚洲三级网址| 欧美精品福利| 福利在线一区| 日韩免费高清| 妖精视频成人观看www| 久久国产精品久久久久久电车 | 日韩国产精品久久久| 国产激情久久| 亚洲精品国产嫩草在线观看| 国产精品国产一区| 久久免费高清| 欧美搞黄网站| 日韩区一区二| 国产精品网在线观看| 国产精品精品国产一区二区| 在线亚洲自拍| 国产精品白丝av嫩草影院| 国产伦精品一区二区三区视频 | 精品欧美视频| 美女久久久久| 国产亚洲一区二区三区不卡| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 美女高潮久久久| 亚洲黄页一区| 私拍精品福利视频在线一区| 91九色综合| 亚洲综合专区| 99热精品在线| 亚洲精品小说| 欧美一区三区| 精品国模一区二区三区| 久久精品国产久精国产爱| 欧美日韩一区二区国产| 日韩区欧美区| 日韩精品免费视频一区二区三区| 97精品国产福利一区二区三区| 欧美日韩第一| 国内一区二区三区| 日韩一区二区三区精品视频第3页| 亚洲不卡系列| 久久精品99国产国产精| 久久av在线| 亚洲黄色在线| 999久久久91| 六月婷婷综合| 伊人网在线播放| 成人日韩av| 精品欧美日韩精品| 国产伦精品一区二区三区千人斩| 综合亚洲自拍| 中文字幕一区二区三区日韩精品| 欧美+亚洲+精品+三区| 日韩高清欧美| 亚洲国产成人二区| а√天堂8资源在线| 精品日本视频| av日韩中文| 久久久久欧美精品| 国产综合精品一区| 99精品在线观看| 日韩精品2区| 欧美中文字幕一区二区| 激情婷婷综合| 中国女人久久久| 婷婷精品在线| 国产女人18毛片水真多18精品| 国产精品入口久久| 开心激情综合| 日韩中文欧美| 国产一区日韩一区| 影音国产精品| 中文字幕av一区二区三区四区| 日韩欧美中文字幕在线视频| 国产精品麻豆成人av电影艾秋| 国产在线看片免费视频在线观看| 日韩中文影院| av成人国产| 国产精品男女| 成人福利av| 男女精品网站| 久久精品五月| 在线综合亚洲| 精品久久国产一区| 亚洲精品网址| 国产精品a级| 精精国产xxxx视频在线野外| 黄色日韩在线| 国产91欧美| 97精品资源在线观看| 蜜臀久久99精品久久一区二区| 日韩二区三区四区| 蜜臀久久99精品久久一区二区| 久久不见久久见国语| 亚洲精品2区| 日本激情一区| 欧美天堂一区| 亚洲一区亚洲| 91精品国产乱码久久久久久久| 婷婷成人av| 婷婷精品进入| 日本伊人久久| 久久视频国产| 久久99久久人婷婷精品综合| 夜夜精品视频| 伊人久久大香线蕉av不卡| 久久不见久久见中文字幕免费| 美女精品一区| 久久亚洲国产精品一区二区| 久久精品导航| 福利在线免费视频| 久久亚洲美女| 久久男女视频| 午夜影院一区| www.九色在线| 日韩一区电影| 九九久久国产| 狂野欧美性猛交xxxx| 国产精品伊人| 国产免费av国片精品草莓男男 | 中国字幕a在线看韩国电影| 日韩欧美四区| 日韩有吗在线观看| 日韩和欧美一区二区三区| 婷婷综合电影| 国产精品亚洲片在线播放| 国产精品夜夜夜| 四虎国产精品免费观看| av中文字幕在线观看第一页 | 911精品国产| 久久成人福利| av在线日韩| 黄色成人精品网站| 亚洲aⅴ网站| 久久精品99国产精品| sm捆绑调教国产免费网站在线观看| 久久久久久婷| 国产一区成人| 国产精品密蕾丝视频下载| 精品久久中文| 免费欧美一区| 日本一区福利在线| 精品视频一二| 欧美精品日日操| 99re国产精品| 日韩精品电影一区亚洲| 国产成人精选|