电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Spring Boot讀取自定義配置文件

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

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

felord: phone: 182******32 def: name: 碼農小胖哥 blog: felord.cn we-chat: MSW_623 dev: name: 碼農小胖哥 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的自動轉換。

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

另外我們如果想進行嵌套的話可以借助于@NestedConfigurationProperty注解實現。也可以借助于內部類。這里用內部類實現將開頭yaml中所有的屬性進行注入:

package cn.felord.yaml.properties; import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties; import static cn.felord.yaml.properties.FelordProperties.PREFIX; /** * 內部類和枚舉配置. * * @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相關屬性介紹

value:指明加載配置文件的路徑。 ignoreResourceNotFound:指定的配置文件不存在是否報錯,默認是false。當設置為 true 時,若該文件不存在,程序不會報錯。實際項目開發中,最好設置 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;}

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

前邊提到了用@PropertySource只能加載*.properties文件,但如果我們項目的配置文件不是*.properties這種類型,而是其他類型,諸如yaml,此時我們可以通過實現PropertySourceFactory接口,重寫createPropertySource方法,就能實現用@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、實現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下創建spring.factories

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

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

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

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

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

總結

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

相關的demo地址

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

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

以上就是Spring Boot讀取自定義配置文件的詳細內容,更多關于Spring Boot讀取自定義配置文件的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
主站蜘蛛池模板: 物流公司电话|附近物流公司电话上门取货 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 吊篮式|移动式冷热冲击试验箱-二槽冷热冲击试验箱-广东科宝 | 混合生育酚_醋酸生育酚粉_琥珀酸生育酚-山东新元素生物科技 | hdpe土工膜-防渗膜-复合土工膜-长丝土工布价格-厂家直销「恒阳新材料」-山东恒阳新材料有限公司 ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | 中视电广_短视频拍摄_短视频推广_短视频代运营_宣传片拍摄_影视广告制作_中视电广 | 超高频感应加热设备_高频感应电源厂家_CCD视觉检测设备_振动盘视觉检测设备_深圳雨滴科技-深圳市雨滴科技有限公司 | 哈希余氯测定仪,分光光度计,ph在线监测仪,浊度测定仪,试剂-上海京灿精密机械有限公司 | 电子天平-华志电子天平厂家 | 老房子翻新装修,旧房墙面翻新,房屋防水补漏,厨房卫生间改造,室内装潢装修公司 - 一修房屋快修官网 | 标准件-非标紧固件-不锈钢螺栓-非标不锈钢螺丝-非标螺母厂家-三角牙锁紧自攻-南京宝宇标准件有限公司 | 全自动端子机|刺破式端子压接机|全自动双头沾锡机|全自动插胶壳端子机-东莞市傅氏兄弟机械设备有限公司 | 中空玻璃生产线,玻璃加工设备,全自动封胶线,铝条折弯机,双组份打胶机,丁基胶/卧式/立式全自动涂布机,玻璃设备-山东昌盛数控设备有限公司 | 农业仪器网 - 中国自动化农业仪器信息交流平台 | 3dmax渲染-效果图渲染-影视动画渲染-北京快渲科技有限公司 | 托利多电子平台秤-高精度接线盒-托利多高精度电子秤|百科 | 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 恒温槽_恒温水槽_恒温水浴槽-上海方瑞仪器有限公司 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 真空包装机-诸城市坤泰食品机械有限公司 | 圣才学习网-考研考证学习平台,提供万种考研考证电子书、题库、视频课程等考试资料 | 深圳货架厂_仓库货架公司_重型仓储货架_线棒货架批发-深圳市诺普泰仓储设备有限公司 | 合肥礼品公司-合肥礼品定制-商务礼品定制公司-安徽柏榽商贸有限公司 | 光伏家 - 太阳能光伏发电_分布式光伏发电_太阳能光伏网 | 沧州友城管业有限公司-内外涂塑钢管-大口径螺旋钢管-涂塑螺旋管-保温钢管生产厂家 | 标准件-非标紧固件-不锈钢螺栓-非标不锈钢螺丝-非标螺母厂家-三角牙锁紧自攻-南京宝宇标准件有限公司 | 宝元数控系统|对刀仪厂家|东莞机器人控制系统|东莞安川伺服-【鑫天驰智能科技】 | 室内室外厚型|超薄型|非膨胀型钢结构防火涂料_隧道专用防火涂料厂家|电话|价格|批发|施工 | 服务器之家 - 专注于服务器技术及软件下载分享 | 防火板_饰面耐火板价格、厂家_品牌认准格林雅 | 翅片管散热器价格_钢制暖气片报价_钢制板式散热器厂家「河北冀春暖气片有限公司」 | 工控机,嵌入式主板,工业主板,arm主板,图像采集卡,poe网卡,朗锐智科 | 北京翻译公司_同传翻译_字幕翻译_合同翻译_英语陪同翻译_影视翻译_翻译盖章-译铭信息 | 阴离子_阳离子聚丙烯酰胺厂家_聚合氯化铝价格_水处理絮凝剂_巩义市江源净水材料有限公司 | 浙江宝泉阀门有限公司| 深圳侦探联系方式_深圳小三调查取证公司_深圳小三分离机构 | 电机铸铝配件_汽车压铸铝合金件_发动机压铸件_青岛颖圣赫机械有限公司 | 山东彩钢板房,山东彩钢活动房,临沂彩钢房-临沂市贵通钢结构工程有限公司 | 背压阀|减压器|不锈钢减压器|减压阀|卫生级背压阀|单向阀|背压阀厂家-上海沃原自控阀门有限公司 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 老房子翻新装修,旧房墙面翻新,房屋防水补漏,厨房卫生间改造,室内装潢装修公司 - 一修房屋快修官网 |