springboot加载配置文件属性|SpringBoot 配置文件详解(告别XML)

|

1. springboot配置文件读取

springboot支持多种配置文件读取方式,了解这些方式有助于查询和定位问题以及选择合适的方式进行开发。 springboot默认的配置文件是application.properties,其存放的位置可以有以下几种,从上到下按照优先级排序如下,注意,当存在重复的配置文件时,高优先级的的将会覆盖低优先级的。 若不想使用默认的application.properties配置文件,也可以自定义配置文件名,有两种方式: 这里可以一次性将所有的配置全部加载进入配置文件,然后在使用到的类中注入Configuration 实例,使用get方法获取属性。 在实际工作中,需要根据开发、测试和生产配置不同环境的配置文件。可以在合适的路径下(见第一节配置文件位置)存放 application-dev.properties,application-test.properties,application-prod.properties 三个配置文件分别代表三个不同的环境,在springboot应用启动时传入指定的参数,例如 –spring.profiles.active=prod 指定使用 application-prod.properties 文件,另外也可以采用将 spring.profiles.active=prod 配置到系统环境变量中,使用 –spring.config.location=../config/application-{spring.profiles.active}.properties ,springboot还支持加载多个不同的配置文件,例如 –spring.profiles.active=prod,test

2. 单体Spring boot引入外部配置文件yml,properties

我们在做微服务项目时候会引入spring cloud框架,对于配置文件我们就会通过spring cloud config来配置,实现线上环境动态修改配置文件属性而不需要重新打jar 包。 但是对于单体的spring boot工程,我们又希望可以在生产环境中方案修改配置文件属性。 通过引入外部配置文件,应用启动时候设置配置文件的自动加载 1: 在单体工程的root目录下添加一个config目录,然后新建我们的properties, 如:jdbc-db.properties, redis.properties 2: 然后在我们的application启动类上添加@propertySources注解引入我们的外部文件 注意:因为PropertySources 默认只解析.properties文件,如果要解析yml文件,需要指定factory只需要实现org.springframework.core下的 PropertySourceFactory 接口就OK了。 简单的properties配置文件只需要按如下方式配置即可 只需要1,2步骤就可以完成外部文件的加载,如果涉及到线上修改配置就只需要手动修改配置文件,重新启动应用即可生效。

3. springboot配置文件注解

springboot使用一个全局配置文件,配置文件的名字是固定的: application.properties或application.yml

@ConfigurationProperties: 将 全局配置文件 的属性值,映射到SpringBoot 组件 上 @Value: 从 全局配置文件 中读取属性,映射到组件上

@PropertySource: 加载指定的配置文件。可以配合 @Value 和 @ConfigurationProperties 使用。默认只能加载XML文件,若需要加载yml文件需要实现 DefaultPropertySourceFactory 的 createPropertySource() 方法,并在注解中声明。spring boot 中 yml 、yaml 对应的加载类为 YamlPropertySourceLoader .

@ImportResource: 加载自定义的Spring XML 配置文件 SpringBoot不推荐使用这种方式,推荐使用全注解(javaConfig)的方式。 SpringBoot会扫描当前包和所有子包的注解配置到容器中。

4. SpringBoot的自定义配置

SpringBoot免除了项目中大部分的手动配置,对一些特定情况,我们可以通过修改全局配置文件以适应具体生产环境,可以说,几乎所有的配置都可以写在application.properties文件中,SpringBoot会自动加载全局配置文件,从而免除我们手动加载的烦恼。但是,如果我们自定配置文件,SpringBoot是无法识别这些配置文件的,此时就需要我们手动加载。接下来,将针对SpringBoot的自定义配置文件及其加载方式进行讲解。 对于这种加载自定义配置文件的需求,可以使用@PropertySource注解结合@Configuration注解配置类的方式来实现。@PropertySource注解用于指定自定义配置文件的具体位置和名称。同时,为了保证SpringBoot能够扫描该注解,还需要类添加@Configuartion注解将实体类作为自定义配置类。 当然,如果需要将自定义配置文件中的属性值注入到对应类的属性中,可以使用@ConfigurationProperties或者@Value注解进行属性值注入 打开SpringBoot项目的resources目录,在项目的类路径下新建一个test.properties自定义配置文件,在该配置文件中编写需要的配置属性 在com.david.pojo包下新创建一个配置类MyProperties,提供 test.properties 自定义配置文件中对应的属性,并根据@PropertySource注解的使用进行相关配置 主要是一个自定义配置类,通过相关注解引入了自定的配置文件,并完成了自定义属性值的注入。针对示例中的几个注解,具体说明如下: 1)@Confiruation注解表示当前类是一个自定义配置类,并添加为Spring容器的组件,这里也可以使用传统的@Component注解 2)@PropertySource("classpath:properties")注解指定了自定义配置文件的位置和名称,此示例表示自定义配置文件为classpath类路径下的 test.properties 文件 3)@ConfigurationProperties(prefix="test")注解将上述自定义配置文件 test.properties 中以test开头的属性值注入到该配置类属性中 4)如果配置类上使用的是@Componnet注解而非@Configuration注解,那么@EnableConfigurationProperties注解还可以省略 在SpringBoot框架中,推荐使用配置类的方式向容器中添加和配置组件 在SpringBoot框架中,通常使用@Configuration注解定义一个配置类,SpringBoot会自动扫描和识别配置类,从而替换传统Spring框架中的XML配置文件。 当定义一个配置类后,还需要在类中的方法上使用@Bean注解进行组件配置,将方法的返回对象注入到Spring容器中,并且组件名称默认使用的是方法名,当然也可以使用@Bean注解的name或value属性自定义组件的名称 在项目下新建一个

5. springboot实现动态加载远程配置文件

有个独立的API项目,该项目主要是对外部各个系统提供API接口,为了保证调用的安全,需要对请求进行校验,主要校验包括调用频率,访问IP,是否跨域和Token,其中IP和是否跨域的配置会根据接入方进行相应的修改,为了避免每次有新的接入方就得去修改一次配置文件并重启项目,所以打算使用动态配置的方式。 初级实现方案:API服务每隔5分钟向管理端请求一次数据,管理端添加IP和域白名单的管理,这个实现方案,简单好用,但是弊端也明显,管理端每次修改完配置后,客户端需要等待下次请求后才会加载对应的配置,同时,还需要自己管理获取到的配置文件 更新方案:在springboot启动时,先从远端获取配置文件,并将其加载进Environment对象中,其余的,就都交给Spring了。同时配合spring-cloud-context实现远程配置变更后,本地重新拉取配置并更新点进去之后,springboot会在这里初始化ConfigurableEnvironment对象 这里是给ConfigurableEnvironment做一些初始化工作,我们先不管了,重点在这里,listeners.environmentPrepared(environment);,Springboot通过事件,将Environment的加载分发出去 到此为止,我们就能像使用本地配置文件一样使用服务器上的配置文件了,但是这里还只实现了加载远程配置文件,我们还需要在远程配置文件变更时,实现配置文件的热更新

6. SpringBoot中yaml文件配置属性

首先,在SpringBoot中,有两种配置文件的方式。一种是application.properties,另一种application.yaml(或者是application.yml)。 yaml文件格式是SpringBoot支持的一种JSON超集文件格式,相对于传统的Properties配置文件,yaml文件以数据为核心,是一种更为直观且容易被计算机识别的数据序列化格式。application.yaml配置文件的工作原理和application.properties是一样的,只是yaml格式配置文件看起来要跟简洁一些。 application.yaml文件使用 key:(空格) value 格式配置属性,使用缩进控制层关系

注意:此时port和path属性,属于同一层级

其中缩进式写法有两种表示形式,一种为:

另一种为:

上述两种缩进式写法为person对象的hobby属性赋值,其中一种是通过“-(空格)属性值”的形式为属性赋值,另一种是直接赋值使用英文逗号分隔属性值。

行内式的写法显然比缩进式写法更加简洁。使用行内式写法设置属性值时,中括号“[ ]”是可以省略的,程序会自动匹配校对属性的值

在yaml配置的属性值为Map或对象类型时,缩进式的形式按照yaml文件格式编写即可,而行内式写法的属性值要用大括号“{ }”包含

7. springboot加载自定义properties原理

springboot自定义属性文件通过value注解引入,和@autowired不同的是,它是由这个来处理,属性文件的读取和注入是在BeanDefinition级别,对象实例化之前。 我们建一个简单的类的梳理一下。 调用堆栈 从refresh开始,主要走了这几个方法: invokes ->processConfigBeanDefinitions ConfigurationClassParser->doProcessConfigurationClass ConfigurationClassParser->processPropertySource ConfigurationClassParser->addPropertySource ConfigurationClassParser主要方法: doProcessConfigurationClass->processPropertySource->addPropertySource 逻辑主要集中在doProcessConfigurationClass方法 doProcessConfigurationClass负责解析@PropertySource,@Import annotations,@ComponentScan等注解 。 1 调用processPropertySource处理自身的propertySource 2 扫描类上的ComponentScan,对扫出的类继续调用parse 3 处理@Import annotations等其他标签 processPropertySource结构很简单: 1根据注解里的location属性载入配置文件 2调用addPropertySource处理每个属性文件 addPropertySource这个类才是真正处理@value属性: 1把用户定义的properties文件加到Eniverment中去 2如果有相同name的属性文件,需要合并 CompositePropertySource 的场景其实是你有两个不同的文件,但是 @PropertySource中设置同样的name属性,这样CompositePropertySource 会做一个合并,按加入的时间顺序取。 增加一个proct2,PropertySource name都设置为myprod debug到addPropertySource,newSource和existing已经不一样了。 environment的propertySources里也有两份文件了。

8. SpringBoot 配置文件详解(告别XML)

快速学会和掌握 SpringBoot 的 核心配置文件的使用。

SpringBoot 提供了丰富的 外部配置 ,常见的有:

其中核心配置文件我们并不陌生,主要以Key-Value的形式进行配置,其中属性Key主要分为两种:

在 application.properties 添加配置如下:

① 添加数据源信息

在 application.propertis 添加配置如下:

① 添加认证信息,其中 socks.indentity.* 是自定义的属性前缀。

② 添加随机值,其中spring.test.* 是自定义的属性前缀。

使用方法: @ConfigurationProperties(prefix = “spring.datasource”)

使用说明:提供 Setter方法 和 标记组件 Component

如何验证是否成功读取配置?答:这里可以简单做个验证,注入 MyDataSource ,使用 Debug 模式可以看到如下信息:

使用方法: @Value(“spring.datasource.*”)

使用说明:提供 Setter方法 和 标记组件 Component

注意事项:@Value不支持注入静态变量,可间接通过Setter注入来实现。

关于两者的简单功能对比:

显然,前者支持松绑定的特性更强大,所以在实际开发中建议使用@ConfigurationProperties来读取自定义属性。

SpringBoot 默认会加载这些路径加载核心配置文件,按优先级从高到低进行排列:具体规则详见 ConfigFileApplicationListener

如果存在多个配置文件,则严格按照优先级进行覆盖,最高者胜出:

举个简单的例子,例如再上述位置都有一个application.properties ,并且每个文件都写入了server.port=xx (xx分别是9001,9002,9003,9004),在启动成功之后,最终应用的端口为:9004。图例:

如果想修改默认的加载路径 或者 调改默认的配置文件名,我们可以借助命令行参数进行指定,例如:

YAML是JSON的一个超集,是一种可轻松定义层次结构的数据格式。

答: 因为配置文件这东西,结构化越早接触越规范越好。这里推荐阅读阮一峰老师写的 YAML语言教程 ,写的很简单明了。

引入依赖: 在POM文件引入 snakeyaml 的依赖。

使用说明: 直接在类路径添加 application.yml 即可。

例如下面这两段配置是完全等价的:

① 在 application.yml 配置数据源:

② 在 application.properties 配置数据源:

在项目的实际开发中,我们往往需要根据不同的环境来加载不同的配置文件。例如生产环境,测试环境和开发环境等。此时,我们可以借助 Profiles 来指定加载哪些配置文件。例如:

温馨提示:如果spring.profiles.active指定了多个配置文件,则按顺序加载,其中最后的优先级最高,也就是最后的会覆盖前者。

使用方法: 使用Maven插件打包好项目,然后在当前路径,执行DOS命令: java -jar demo.jar –server.port=8081 ,在控制台可看到应用端口变成了8081。

实现原理: 默认情况下,SpringBoot会将这些命令行参数转化成一个 Property ,并将其添加到 Environment 上下文。

温馨提示: 由于命令行参数优先级非常之高,基本高于所有常见的外部配置,所以使用的时候要谨慎。详见 PropertySource 执行顺序 。

关闭方法: 如果想禁用命令行属性,可以设置如下操作:springApplication.setAddCommandLineProperties(false)

9. Spring Boot 第二弹,配置文件详解-史上最全

  Spring Boot 官方 提供了两种常用的配置文件格式,分别是 properties 、 YML 格式。相比于 properties 来说, YML 更加年轻,层级也是更加分明。 强烈推荐使用 YML 格式

  Spring Boot项目 启动会扫描以下位置的 application.properties 或者 application.yml 作为默认的配置文件.

徒手撕源码

内部类Loader的load方法

getSearchLocations()方法

asResolvedSet()

下面给出优先级 从高到低 的配置文件排列顺序:

以设置应用端口为例 初体验Spring Boot配置文件

properties后缀结尾(application.properties)

yml/yaml后缀结尾(application.yml/application.yaml)

数字,字符串,布尔,日期

对象、Map

数组

数字,字符串,布尔,日期

对象、Map

数组

@ConfigurationProperties(prefix = “person”)详解

标注在类上

标注在方法上

综上所述   @ConfigurationProperties 注解能够轻松的让配置文件跟实体类绑定在一起。

 值得关注的是: @ConfigurationProperties 这个注解仅仅是支持从 Spring Boot的默认配置文件 中取值,也就是 application.properties 、 application.yml 、 application.yaml ,那我们如何从自定义配置文件取值呢???  别着急,有解决办法,那就是再加一个注解: @PropertySource(value = “classpath:custom-profile.properties”) ,下面会有对 @PropertySource 注解的介绍。请耐心往下面看。

使用@PropertySource注解

对应配置文件

创建两个配置文件 custom-profile.yml、custom-profile1.yml ,如下去引入。

我们可以通过控制变量法进行测试,具体过程我这里就不赘述了。 直接说 结论 吧: Spring加载顺序 为 从左到右顺序加载 ,后加载的会 覆盖 先加载的属性值。

另外需要注意的是 : @PropertySource 默认加载 xxx.properties类型 的配置文件,不能加载 YML格式 的配置文件。如何解决呢?下面来解决这一问题

对应配置文件:

编写PropertiesController

扩展功能

application.yml 主配置文件

application-dev.yml 开发配置文件

application-prod.yml 生产配置文件

application-test.yml 测试配置文件

(1)主配置文件:配置激活选项

(2)其他配置文件:指定属于哪个环境(同yml,只不过表现形式是 key=value 的,三个配置文件分别是: application-dev.properties , application-prod.properties , application-test.properties )

 无论是使用上述 多文档块 的方式,还是新建 application-test.yml 文件,都可以在配置文件中指定 spring.profiles.active=test 激活指定的profile。

感谢阅读小生文章。祝大家早日富可敌国,实现财富自由。 写文不易 ,一定要 点赞、评论、收藏哦 , 感谢感谢感谢!!!

10. Springboot 使用@RefreshScope 注解,实现配置文件的动态加载

实现配置文件动态读取的好处不必多说,修改配置文件后不必重启Application ,想想就开心。 合格调包侠的必备技能,从Maven仓库引入依赖的Jar包, 搞好配置文件,默认在application.yml /properties 就行,与本功能相关的配置项(采用yml格式)如下: distributed-id是自定义需要动态部署的配置文件。management:是暴露refresh接口,不加此条配置将无法启用动态加载配置文件的功能(也就是管你理解不理解,别问,加就对了)。 1.编写自定义配置文件的Java对象,一定要在类上加@RefreshScope注解 @data是lombok的注解,别的注解不多说。 2.编写你的conroller ,也一定要加@RefreshScope注解, 不加的话,呵呵,对不起,无法运行。。原因吗—在这 @RefreshScope not working – Spring Boot – Stack Overflow    我这里是返回配置文件中distributed-id.mechineId的值。3.到此为止了,简单吧😒。其实的话,第一步也可以直接在Bean的配置中心(也就是@Configuration注解的类)搞一下,效果是一样的。 使用这种写法,就可以不用在配置对象类上加@Component和@RefreshScope。 测试一下啦,启动应用前,将配置文件设置如下: 运行程序后,在浏览器输入你的测试地址,返回如下,是5没错了: 然后找到你编译后文件,修改配置文件的值,注意是 编译后的配置文件     就是下图中灰色文件的位置 修改如下:mechineId修改为4 接下来向 http://localhost:port/actuator/refresh 发送 POST 请求,get请求是无法识别的呦😘,可以看到返回了配置文件中被更改的属性 测试一下,没错了,返回值为4


赞 (0)