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

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

Spring Boot讀取自定義配置文件

瀏覽:27日期: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才能正確注入對應的值。例如felord.phone我們可以通過@Value獲取,但是felord.def不行,因為felord.def后面沒有直接的值,它還有下一級選項。另外@Value不支持yaml松散綁定語法,也就是說felord.def.weChat獲取不到felord.def.we-chat的值。

@Value是通過使用Spring的SpEL表達式來獲取對應的值的:

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

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

@ConfigurationProperties

@ConfigurationProperties注解提供了我們將多個配置選項注入復雜對象的能力。它要求我們指定配置的共同前綴。比如我們要綁定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行嵌套的話可以借助于@NestedConfigurationProperty注解實現(xiàn)。也可以借助于內(nèi)部類。這里用內(nèi)部類實現(xiàn)將開頭yaml中所有的屬性進行注入:

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進行注冊,這樣就不需要顯式聲明配置類為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 {}

該注解需要顯式的注冊對應的配置類。

@ConfigurationPropertiesScan

在Spring Boot 2.2.0.RELEASE中提供了一個掃描注解@ConfigurationPropertiesScan。它可以掃描特定包下所有的被@ConfigurationProperties標記的配置類,并將它們進行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可以用來加載指定的配置文件,默認它只能加載*.properties文件,不能加載諸如yaml等文件。

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

value:指明加載配置文件的路徑。 ignoreResourceNotFound:指定的配置文件不存在是否報錯,默認是false。當設置為 true 時,若該文件不存在,程序不會報錯。實際項目開發(fā)中,最好設置 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注解了。當我們使用@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。需要補充一點的是@ConfigurationProperties還支持使用 JSR303 進行屬性校驗。好了今天的教程就到這里

相關(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讀取自定義配置文件的詳細內(nèi)容,更多關(guān)于Spring Boot讀取自定義配置文件的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产+成+人+亚洲欧洲在线| 蜜桃一区二区三区| 日本欧美在线看| 99国内精品| 视频一区免费在线观看| 中文无码日韩欧| 亚洲69av| 亚洲精品在线a| 日本一区二区三区视频在线看| 蜜桃一区二区三区在线| 日韩成人在线看| 欧美国产亚洲精品| 伊伊综合在线| 女主播福利一区| 中文字幕免费精品| 国产亚洲人成a在线v网站| 精品久久精品| 九一精品国产| 午夜视频一区二区在线观看| 国产区精品区| 国产精品13p| 亚洲午夜一级| 免费在线观看成人| 国产精久久久| | 国产va免费精品观看精品视频| 成人台湾亚洲精品一区二区| 色老板在线视频一区二区| 欧美午夜不卡| 日韩成人精品一区二区三区| 国产精品**亚洲精品| 欧美aa在线观看| 国产精品社区| 国产欧美日韩综合一区在线播放| 国产a久久精品一区二区三区| 久久网站免费观看| 亚洲欧洲专区| 国产成人精品一区二区三区免费 | 三级一区在线视频先锋| 国产欧美精品| 久久精品二区三区| 香蕉久久一区| 日韩免费福利视频| 亚洲精品一区二区在线播放∴| 麻豆国产精品一区二区三区| 99久久久久久中文字幕一区| 亚洲人成网77777色在线播放| 国产一区二区三区久久| 午夜国产一区二区| 国产精品久久久久久久免费软件| 久久中文字幕av| 欧美综合精品| 婷婷成人综合| 国产精品v日韩精品v欧美精品网站| 在线一区视频观看| 欧美日韩精品一区二区三区视频| 日本蜜桃在线观看视频| 亚洲日韩中文字幕一区| 亚洲最新无码中文字幕久久 | 麻豆成人在线观看| 欧美日韩国产探花| 国产精品久久免费视频| 欧美精品自拍| 国产精品不卡| 日韩久久99| 欧美日韩国产高清电影| 国产精品久久国产愉拍| 亚洲一区欧美二区| 中文字幕在线高清| 欧美视频久久| 久久xxxx精品视频| 播放一区二区| 免费精品一区| 亚洲精品美女91| 激情综合网站| 国产一区二区精品久| 亚洲精品乱码日韩| 91精品一区国产高清在线gif | 亚洲免费中文| 最新中文字幕在线播放| 日韩福利在线观看| 亚洲一卡久久| 亚洲国产专区校园欧美| 国内一区二区三区| 婷婷精品在线观看| 午夜精品亚洲| 久久精品国内一区二区三区水蜜桃| 日韩精品久久久久久| 欧美99久久| 国产精品久久久久久久久久10秀| 日韩国产91| 亚洲欧美专区| 亚洲免费在线| 午夜国产欧美理论在线播放| 久久男人av资源站| 你懂的亚洲视频| 国产探花一区在线观看| 视频一区国产视频| 黄色亚洲大片免费在线观看| 午夜影院一区| а√天堂8资源在线| 精品一区二区三区四区五区| 日本视频一区二区| 亚洲美女91| 亚洲视频国产| 玖玖玖国产精品| 国产亚洲毛片在线| 尤物在线精品| 激情五月综合| 国产精品99免费看| 国精品一区二区三区| 人人精品亚洲| 婷婷激情一区| 国产精品亚洲一区二区三区在线观看| 精品一区二区三区视频在线播放 | 日韩亚洲精品在线观看| 天使萌一区二区三区免费观看| 欧美亚洲精品在线| 99热精品久久| 欧美日韩四区| 久久一二三区| 亚洲综合福利| 日本亚州欧洲精品不卡| 亚洲精品成人一区| 日韩有吗在线观看| 日本不卡高清| 国产亚洲精aa在线看| 国产毛片久久久| 麻豆精品视频在线| 国产成人免费| 久久国产亚洲| 国产精品av一区二区| 亚洲激情中文在线| 欧美日韩国产在线一区| 午夜一区在线| 亚洲毛片一区| 国产欧美一区二区色老头| 老司机精品在线| 日韩中文影院| 亚洲精品中文字幕乱码| 99国产精品视频免费观看一公开| 免费在线观看视频一区| 日本视频一区二区| 麻豆视频一区二区| 伊伊综合在线| 亚洲欧洲日本mm| 国产一区二区高清| 亚洲69av| 国内不卡的一区二区三区中文字幕| 国产精品久久久久久久久久10秀| 久久久久蜜桃| 亚洲综合中文| 国产美女亚洲精品7777| 人人草在线视频| 一区在线视频观看| 日本欧美在线| 久久99偷拍| 久久三级视频| 视频一区二区欧美| 国产精品99精品一区二区三区∴ | 日韩在线观看一区二区| 日本少妇一区二区| 精品99在线| 欧美日韩日本国产亚洲在线| 日韩欧美四区| 国产精品二区不卡| 午夜免费一区| 久久国产麻豆精品| 日本韩国欧美超级黄在线观看| 男人的天堂久久精品| 久久av综合| 精品中文一区| 欧美日韩伊人| 久久免费大视频| 7m精品国产导航在线| 成人小电影网站| 亚洲精品影视| 亚洲四虎影院| 日韩精品a在线观看91| 高清日韩欧美| 日av在线不卡| 国产福利91精品一区二区| 亚洲精品中文字幕乱码| 国产精品欧美在线观看| 99视频精品全国免费| 欧美久久一区二区三区| 亚洲精品一级二级| 日韩精品一级| 久久精品国产www456c0m| 日韩动漫一区| 91精品一区国产高清在线gif| 欧美亚洲一级| 在线综合亚洲| 9999国产精品| 日韩国产精品久久久| 欧美丝袜一区| 美女av一区| 蜜臀精品一区二区三区在线观看| 久久精品国产久精国产爱| 久久av在线|