⑴ Spring Boot读取properties配置文件中的数据
GitHub: SpringBootDemo
Gitee: SpringBootDemo
微信公众号:
Spring Boot读取properties配置文件数据主要有以下三种方法:
1. 使用@Value注解读取
在读取properties配置文件时,默认读取的是application.properties。
application.properties:
java代码:
运行结果如下:
如果需要将部分数据放到一个单独的类A中进行读取,然后在类B中调用,则需要在类A上添加@Component注解,并在类B中使用@Autowired自动装配类A,代码如下。
类A:
类B:
运行结果如下:
注意:如果@Value${}所包含的键名在application.properties配置文件中不存在,会抛出异常。
2. 使用Environment读取
application.properties:
Java代码:
运行,发现中文乱码:
在application.properties中进行如下配置:
然后修改IntelliJ IDEA,File -> Settings -> Editor -> File Encodings ,将最下方Default encoding for properties files设置为UTF-8,并勾选Transparent native-to-ascii conversion。
重新运行结果如下:
3. 使用@ConfigurationProperties注解读取
在实际项目中,当项目需要注入的变量值很多时,上述所述的两种方法工作量会变得比较大,这时我们通常使用基于类型安全的配置方式,将properties属性和一个Bean关联在一起,即使用大绝注解@ConfigurationProperties读取配置文件数据。
在src\main\resources下新建config.properties配置文件:
创建ConfigBeanProp并注入config.properties中的值:
使用时,先使用@Autowired自碧枣动装载ConfigBeanProp,然后再进悔仿拆行取值,示例如下:
运行结果如下:
GitHub:
CSDN:
微信:
微博:
⑵ Springboot 读取配置文件原理
Springboot 读取配置文件(application.yaml, application.properties)的过程发生在SpringApplication#prepareEnvironment() 阶段,而prepareEnvironment又属于整个Springboot 应用启动的非常前置阶段,因为Environment的准备是后续bean创建的基础。让我们来一探启动是的详细code。除去StopWatch这些code,可以发现prepareEnvironment 发生在SpringApplication#run 这在整个应用启动的多步实质性操作中几乎是第一步。
而prepareEnvironment中最重要的是通过触发listener(EventPublishingRunListener)来通过#multicastEvent发出。
而#multicastEvent的实现其实也很简单,找到相关的监听的listener,然后一个个的调用他们的Listener#onApplicationEvent(event)方法,而这其中就包括了处理configuration文件的listener。
在Springboot 2.4.0 之前这个处理configuration 文件的lister是ConfigFileApplicationListener,在2.4.0之后,处理configuration 文件的lister是,并且对configuration文件的加载做了较大的改变,导致一些行为可能出现了变化,这也就是下面要详细讲的内容。
Springboot 2.4.0之后,configuration 文件的load顺序按照优先级是如下顺序(序号大的会被小的覆盖):
和之前版本比较,整体的属性加载顺序并无调整,只有Application properties(14,15)这里有顺序的调整,具体调整为:
如果存在多个active的profiles,例如[Test, Dev], 那么对于同时存在两个profile 配置文件中的配置,后面的profile里的配置(Dev)会覆盖前面profile(Test)里配置的值。
前面讲了这么多,终于要引出Springboot 2.4之后配置文件加载的行为变化了。
考虑这样的情况,如果我想在跑Springboot test的时候指定特定的profile,那么可以在Test class中加入@ActiveProfile("Test")。 如果我的应用中存在的某个自定义listener中,会根据当前environment 设置profile,如env.addActiveProfile("Dev")。
当前就会有两个active profile,由于springboot-test会在调用application#run 前利用DefaultActiveProfilesResolver把@ActiveProfile注解定义的profile(Test)先加入了active的profile,等test run的时候 env.addActiveProfile("Dev") 又会把"Dev"也作为active profile 加入,这时候当前的active profile便为["Test", "Dev"]。
据上面介绍,后面的profile(Dev)对应的configuration 会覆盖前面的(Test)。可Springboot 2.4.0之前的版本为我们做了调整,让Test class中@ActiveProfile内定义的profile所对应的配置文件成为最高优先级。
刚才提到在Springboot 2.4.0 之前这个处理configuration 文件的lister是ConfigFileApplicationListener,我们
来看看ConfigFileApplicationListener的相关code。
查看initializeProfiles(),发现此时对profile的顺序做了调整,将activatedViaProperty (Test) 放在最后add,于是profile的顺序就变成了[Dev, Test]。
在profiles.poll()时原本profile的顺序已经倒了过来,已经变为[Dev, Test], 在load()方法中由于后置的Test profile,application-Test.yaml中的值最终生效了。
可是到了Springboot2.4.0之后,ConfigFileApplicationListener被deprecated了,取而代之的是,通过调用来完成configuration加载。
.java
.java
只是老老实实的set了active profile,并没有调换profile的顺序。最后调用定义在spring.factories中的resource loader class来load 配置文件。
YamlPropertySourceLoader.java
插一句,Springboot为我们提供了很好的yaml文件parse的code,当你需要解析yaml文件时不妨直接参考Springboot的YamlPropertySourceLoader
这样一旦应用升级到Springboot 2.4.0之后相同的test code会使用application-Dev.yaml中配置的值,造成了test结果的改变。
如果要解决这个问题,根据上面介绍的配置文件优先级顺序,可以在@SpringbootTest中设置properties 来作为最终的配置覆盖当前profile对应的配置。
了解一个框架很不容易,一个小小的变化都有可能造成应用的行为变化,唯有刨根问底,不断总结才是framework人解决一切问题的不变的方法论。
⑶ springboot读取配置(springboot读取配置文件)
springboot获取复杂的list配置文件1、我们在使用@ConfigurationProperties(prefix=system)读取yml配置文件过程中会遇到读取yml文件中列表。如:yml文件设置访问白名单,Config里面使用List集合接收。方法比较简单。
2、配置文件SpringBoot使用一个全局的配置文件application.propertiesapplication.yml配置文件的埋祥旁作用:修改SpringBoot自动配置的默认值,SpringBoot在底层都给我们自动配置好。
3、第@Configuration注解,读取配置到类中,批量注入配置属性第Environment对象,获取配置文件中所有的属性的对象如果你想掌握时下热门微服务技术栈,跟上时代技术步伐,就去黑马程序员官网视频库看免费视宴陵频。
4、nacos跟apollo的处理思路有点不一样,找了很多资料,貌似没有找到nacos里直接获取整个获取配置文件的方法,后面如果有同学找到了这个方法记得留言提醒我。nacos在springboot启动的时候已经把所有配置文件都注入到了spring里。
Springboot打成JAR包后读取外部配置文件1、自定义jar目前只能读取application.properties和application.yml吧。可以用一个简单点的方法进行监听注入,在工具包内写一个init方法,在springboot启动时初始化就可以了。比如springboot启动完成后读取配置文件,然后注入到工具包内。
2、在此处,我们可以使用java-jardemo-0.01-SNAPSHOT来运行项目。正常运行。当我们将其打成jar包时,application.properties同样不会被打包进jar包中。需要另外复制出来和jar包放在才能正常运行。
3、以jar包发布springboot项目时,默认会先使用jar包同级目录下的application.properties来作为项目配置文件。但使用--spring.config.location指定了配置文件,则读取指定的配置文件。
SpringBoot配置文件存放位置以及读取顺序SpringBoot系统启动时默认会读取的配置文件,支持propertiesyml格式。也就是说,会先加载application.properties,根据spring.profile.active的设置加载相应的application-XX.properties配置,然后按优先级合并配置文件。
使用springboot的方式,此种方式jar需要放到前面格式例如以jar包发布springboot项目时,默认会先使用jar包同级目录下的application.properties来作为项目配置文件。
application.properties中:server.port=8001,application.yml中:server.port=8888。问题:springboot是否都加载这两个配置文件?如果两个文件有相同的key,取哪一个文件的value?答:都加载,且按properties→yml的顺弯橡序加载。
springboot配置文件支持灵活的路径,以及灵活的文件名,用一个变量表达式总结如下:部分源码如下:当满足上述变量表达式的配置文件有多个时,会有一个配置的优先级。
springboot中获取apollo或者nacos里的配置文件
此时,需要在bootstrap.yml中添加springcloud配置:(至于为什么是bootstrap.yml而不是application.yml,这又是另一个问题了)有了上面的配置,程序启动后,就能正常的从nacos配置中心获取配置了。
在application.yaml配置文件中指定nacos中配置的DataID不会生效,需要通过注解@NacosPropertySource指定才能生效。
nacos-config这个依赖就相当于SpringCloudConfig,nacos-discovery这个依赖就相当于Eureka。
一文讲清楚SpringBoot六种读取配置方式1、使用开发工具创建一个纯净maven工程删除配置spring-biz.xml并且新增如下配置:本文梳理了SpringBoot六种读取配置方式,大家在项目中可以进行灵活组合和应用,希望本文对大家有所帮助。
2、则只会根据classloader的classpath列表,选取第一个出现的文件。因为springboot加载配置文件时最底层是使用的下面的方法:这两个方法只会获取classloader类的ucp属性里面第一个匹配到的值。
3、idea中,为了我们本地方便开发测试,我们在此处创建一个config目录,然后把application.properties放进去,项目正常运行。jar包会自动生成在target目录下。
4、配置文件SpringBoot使用一个全局的配置文件application.propertiesapplication.yml配置文件的作用:修改SpringBoot自动配置的默认值,SpringBoot在底层都给我们自动配置好。
5、SpringBoot中的配置文件主要有三种格式,properties、yaml、和xml方式。
6、SpringBoot系统启动时默认会读取的配置文件,支持propertiesyml格式。也就是说,会先加载application.properties,根据spring.profile.active的设置加载相应的application-XX.properties配置,然后按优先级合并配置文件。
springboot配置文件读取nacos在springboot启动的时候已经把所有配置文件都注入到了spring里。
idea中,为了我们本地方便开发测试,我们在此处创建一个config目录,然后把application.properties放进去,项目正常运行。jar包会自动生成在target目录下。
这个问题的存在是因为在spring跑到@serviceclass的时候,我们还没有取到配置文件里面的value,所以导致了spring认为这个valuevariable没有initialize。
关于如果修改默认的加载路径和文件名,后面会继续讨论。SpringBoot系统启动时默认会读取的配置文件,支持propertiesyml格式。
⑷ 如何spring使用@value注解读取配置文件的值
首先在spring的核心配置文件中加载 参数配置文件
然后
@Value("${xxx}")
private String xxx