几种获取resources目录下的文件方式

几种获取resources目录下的文件方式,第1张

一般我们的配置信息默认都是会配置在/src/main/resources/applicationproperties(或者applicationyml)文件中,当然,也可以在resources文件夹下添加自己的配置文件,甚至子目录中添加自己的配置文件,那么我们又该如何读取自己添加的配置文件中的内容呢?

我们先定义一个公共的输出配置信息的方法如下:

这里是通过javautil下的Properties类来获取配置文件中的属性

添加自定义的配置文件,在resources目录下添加子目录config并添加配置文件dbproperties

内容如下:

在java中,resources文件夹下的文件在编译后,都是为根目录(classpath)。接下来,准备采用以下的6种方式进行配置内容的读取

在springboot项目我还可以使用如下的方式:

springboot项目中使用

springboot项目中使用

springboot项目中使用,通过@Value注解,但是我们还需要通过@PropertySource(" classpath:config/dbproperties ")

注解指定配置文件的路径,如果是默认的配置文件,如:applicationproperties(yml)就不需要指定路径

通过上述6种方法都可以成功获取到自定义配置文件中的配置信息,如果大家还有更好的方式,可以评论区留言。

demo:

首先解析出来的格式应该是这样的:

首先有一个yml文件,然后有这么个解析器,自己写一个对应yml的javabean。

上面的javabean是程序里面写好的,的的确确,如果写的是spring的话那这个bean应该就在哪个包里面了。

那么变量类型从bean类里面就能读取出来了,顺着yml往下读取,读出一行来然后就去bean里面找对应的行,一行一行往里面填。

如此而言还搞明白了另一件事:那就是yml的解析方式

yml里面的每一段或者没一句可能都对应了一个java写的实体类,最开始是那种碎片式的properties类,然后把yml里面的每一条都整理出来之后

那么多的碎片,一起送进工厂类里面去生产出需要的配置出来

从yml里面读取配置,然后封到一个Config里面去,然后把这个Config转化成Predicate

yml读取中文似乎出问题,如果写了中文是不是那个#的解析就出什么问题了,不能正确读取值了?

反正把IDEA的设置改了就行,改成utf-8的。

spring 配置及配置文件,是学习spring的基础知识,那么,这篇文档我们先了解下spring 的配置写法,以及如何加载配置的。

以key: value来表示,value前必须带一个空格。

第一种写法

第二种写法

大括号的方式,还有逗号

数组用 “-”表示。

当然,还有一种,冒号不要丢失

Spring 的配置通过配置文件进行映射。分为两种方式,一种是 @ConfigurationProperties 读取属性,一种是 @Value 这种读取单个的值。

类文件为

这是一种通过路径 monapi 映射方式。

这里如果

支持对 通过类加载的方式,对配置的值进行映射。

映射完成后,我们还得让Spring 能扫描的到。 那么又可以用到两种方式。

让 Spring 知道我们的 @ConfigurationProperties 类存在,以便将其加载到应用程序上下文中。

第一种,就是让自定义的类,注册成为一个启动类的配置,然后的加载方式。@EnableConfigurationProperties({MonitorApipropertiesclass})

可以在启动类了,就是主入口类,加载配置

第二种,可以直接在 ConfigurationProperties @ComponentScan 注解参数。

还可以通过bean 生成配置。 也可以直接用了,当然如果是bean 加载的话,就不用在

MonitorApiproperties 注释 @Component 了。

调用,一般都是在 Configuration 去取参数,就可以直接用了。

这就比较简单了,直接获取值就行了,只能一个值一个值的获取。

@Component

public class PrometheusRepostitoryImpl implements PrometheusRepostitory {

}

配置文件加载位置和顺序,springboot启动会扫描一下位置的配置文件作为springboot的默认配置文件。

SpringBoot也可以从以下位置加载配置;优先级从高到低,高优先级的配置覆盖低优先级的配置,所有配置形成互补配置。

有时候需要配置多个配置文件,一个主配置文件,applicationyml和开发配置文件,和生产环境配置。

applicationyml

application-devyml

application-prodyml

我们通过在主配置文件用

配置命名

而在 application-devyml 和 application-prodyml ,为了能找到 dev(prod) 的标签,我们通过 ,配置名称方式,来读取。

可以使用springprofileactive来进行切换。

也可以通过命令行指定配置文件

假设一个项目在同一位置同时存在applicationproperties和applicationyml文件,

且其中都含有相同的某个key,但value不同,如:

applicationproperties中:serverport=8001,

applicationyml中:serverport=8888。

问题:springboot是否都加载这两个配置文件?如果两个文件有相同的key,取哪一个文件的value?

答: 都加载,且按properties→yml的顺序加载。

在看到springfactories中,配置加载器顺序是先执行PropertiesPropertySourceLoader再到YamlPropertySourceLoader。

在ConfigFileApplicationListener获取serverport这个key的value时候,可以发现两配置文件全都加载进去了,且注意顺序,applicationproperties文件在前。

getSource()方法获取到两个Source,先从applicationproperties文件中查找值,一旦找到立即返回,如果找不到再从applicationyml中查找。

在 SpringBoot 项目中,获取配置属性可以说是一个非常简单的事情,将配置写在 aplicationyml 文件之后,我们就可以直接通过 @Value 注解来绑定并获取;此外我们也可以将一个结构化的配置,借助 @ConfigurationPorperties 绑定到一个 POJO,然后供项目使用,那么在使用它的时候,不知是否有想过

如果上面这些都已经了然于心,那么本文的帮助将不会特别大;如果对此有所疑问,接下来将逐一进行解惑

本项目借助 SpringBoot 221RELEASE + maven 353 + IDEA 进行开发

下面是核心的 pomxml (源码可以再文末获取)

假定我们现在自定义一个功能模块,里面有一些我们自定义的参数,支持通过 yaml 配置文件的方式注入

首先我们可以先定义一个配置类 BindConfig

请注意上面的注解中, prefix = hhuibind ,简单来讲就是会读取配置文件中,前缀为 hhuibind 的属性,然后依次赋值到这个类中

对应的配置文件如下

注意事项

关于上面最后一点,也就表明我们可以在自动 AutoConfiguration 类中,声明一个内部类来绑定配置信息,如下

我们通过 @ConfigurationProperties 修饰配置类之后,是否直接会生效呢?通常来讲,让它生效有下面三种方式

直接在配置类上添加 @Component , @Configuration 等注解,让 Spring 容器扫描并加载它

使用这种方式时,需要注意配置类在自动扫描的包路径下,否则可能不会被扫描(主要是作为第三方 jar 包提供服务时,可能出现扫描不到的问题)

把它当成一个普通的 bean,借助 bean 注册的方式来实现,也是一个可选的方案,一般的实现方式如下

在配置类上,添加这个注解之后,可以实现配置注册,一般常见的使用姿势如

上面三种注册方式,前面两种的思路是将配置类作为 bean,第三种实现思路和主动注册 bean 一致(所以想实现主动注册 bean,可以考虑它的实现逻辑)

如果我们在配置中,一个本来希望接收 int 类型的参数,结果实际上填了一个非整形,会怎样?

比如前面的配置类,我们实际的配置文件将 age 填 18y,来看一下最终会发生什么事情

简单演示,直接在启动类中测试一下会如何

参数异常之后,直接启动失败,如果对参数的要求没有那么严格,即允许失败,我们可以通过设置 ignoreInvalidFields = true

再次执行之后,会发现正常启动,输出如下

注意查看上面的 age,因为传入的参数非法,所以是 null

说明

结合默认值 + ignoreInvalidFields 方式来支持配置的最大可用性:

再次执行输出如

常见的配置除了基本类型之外,能嵌套自定义对象么,非基本类型又可以如何解析呢?

我们新定义一个 Pwd 类

然后扩展一下 BindConfig

这个时候 mainPwd 对应的 yaml 配置文件可以如下设置

从上面的介绍也可以看出,对于自定义的 POJO 类是支持的,使用姿势也没什么区别

此外,对于 List 和 Map 的使用也给出了实例

上面我们自定义的 Pwd 类,主要借助 setter 方法,将匹配的属性塞入进去;如果我的配置就是一个 json 串,可以注入到一个 POJO 类么

对应的 Jwt 类如下

这个时候如想实现上面的配置解析,可以通过实现 orgspringframeworkcoreconvertconverterConverter 接口来支持,并通过 @ConfigurationPropertiesBinding 注解来表明这是个配置属性转换类,不加这个注解会不生效哦

说明

使用自定义的配置解析规则时,注意两点

Spring 提供了一些默认的配置解析规则,如

一个配置类,对应的类中没有这个属性会怎样?

如针对前面的 BindConfig ,没有 notExist 这个属性,但是配置文件中,却加上了这个

实测之后,发现没有任何影响,通过查看 @ConfigurationProperties 注解的成员,发现可以设置 ignoreUnknownFields=false ,从字面上表示出现了未能识别的成员,不会略错误,但是在实际测试中,并没有生效

参数校验可以说比较常用的 case 了,比如前面的配置 age ,基本上不会允许这个参数能是负数,如需要对参数进行校验,我们可以借助 @Validated 来实现校验

添加 pom 依赖

然后再配置类上添加 @Validated ,然后就可以在需要校验的字段上添加对应的限制

如果我们将 age 参数设置不满足上面的条件

再次测试会发现报如下错误

平时在 Spring 开发过程中,在 yaml 文件中添加配置时,配合 idea 有非常友好的提示,可以非常友好的补全参数配置

那么我们自定义的参数想实现这个效果应该怎么做呢?

添加文章最开头的依赖

添加上面的依赖之后,打包 mvn clean package ,然后会发现在 META-INF 下面有个 spring-configuration-metadatajson

然后自动补全就有了

说明

idea 推荐添加插件 Spring Assistant ,支持非常友好的配置注入

本文介绍了 @ConfigurationProperties 修饰 POJO 类,实现配置的绑定,可以通过将这个类声明为一个普通 bean 的方式进行注册,也可以借助 @EnableConfigurationProperties 来注册

在配置参数时,需要注意如果参数类型不一致,会导致项目启动失败;可以通过设置 ConfigurationProperties#ignoreInvalidFields = true ,来避免这种场景

通过实现接口 Converter + @ConfigurationPropertiesBinding 来自定义参数解析转换规则,可以实现各路姿势的参数解析

配置的自动提示支持也比较简单,添加 orgspringframeworkboot:spring-boot-configuration-processor 依赖,打包之后在 META-INF 中会多一个 json 文件 spring-configuration-metadatajson

项目源码

系列博文

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激

下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

以上的 引用来自Wiki 点击跳转

YAML( /ˈjæməl/ )语言,是一种可读性高、用来表达数据序列的格式。YAML的意思是 'Yet Another Markup Language',即‘仍是一种标记语言’。这个语言以 数据为中心

YAML语言通过空格缩进来展现数据序列,避开了封闭符号,简洁一目了然。

罗列如下:

罗列如下:

YAML语言的一些独特的表达方式:

转化为 JSON 为:

可以理解为map,键值对的

转化为 JSON 为:

等价于下面的 JSON :

& 用来建立锚点, << 表示合并到当前数据, 用来引用锚点。

下面时引用的另一种用法:

等价 JSON :

我们在做微服务项目时候会引入spring cloud框架,对于配置文件我们就会通过spring cloud config来配置,实现线上环境动态修改配置文件属性而不需要重新打jar 包。 但是对于单体的spring boot工程,我们又希望可以在生产环境中方案修改配置文件属性。

通过引入外部配置文件,应用启动时候设置配置文件的自动加载

1: 在单体工程的root目录下添加一个config目录,然后新建我们的properties, 如:jdbc-dbproperties, redisproperties

2: 然后在我们的application启动类上添加@propertySources注解引入我们的外部文件

注意:因为PropertySources 默认只解析properties文件,如果要解析yml文件,需要指定factory只需要实现orgspringframeworkcore下的 PropertySourceFactory 接口就OK了。

简单的properties配置文件只需要按如下方式配置即可

只需要1,2步骤就可以完成外部文件的加载,如果涉及到线上修改配置就只需要手动修改配置文件,重新启动应用即可生效。

以上就是关于几种获取resources目录下的文件方式全部的内容,包括:几种获取resources目录下的文件方式、yml解析方式、Spring Properties整理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9663405.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存