SpringBoot 中配置处理

  1、简介

        本文介绍一些 springboot 配置管理相关的内容,如何自定义配置,导入配置,配置绑定和基于 profiles 的配置。

2、springboot 配置管理
2.1、自定义配置类

        在 spring 中使用 @Configuration 注解定义配置类,在 springboot 中使用 @SpringBootConfiguration 注解替换了 @Configuration 注解。示例如下:

//@Configuration
@SpringBootConfiguration
public class ConfigurationTest {   @Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}
2.2、导入配置类

        导入配置类通过 @Import 注解导入,如果配置类都在类扫描路径下,就不用通过 @Import 注解导入了,如果不在默认类扫描的包下,可以使用 @ComponentScan 注解指定要扫描的包路径。

2.3、配置文件
2.3.1、配置文件格式

1)、properties 类型的配置文件格式采用 key=value 形式。

2)、yml / yaml 类型的文件采用 key: value 树状格式。yml 文件格式有以下两个说明:

        a、键(key)冒号后面需要添加一个空格;

        b、每个层级的缩进用两个空格。

2.3.2、配置绑定

1)、properties 类型可以使用 @PropertySource 和 @Value 注解进行配置绑定。

2)、yml 类型的配置文件不支持使用 @PropertySource 注解进行配置绑定,支持 @ConfigurationProperties 注解进行属性配置。

注意:

1)、@ConfigurationProperties 注解绑定参数,需要用到类的 setter 方法然后在启动类上添加 @EnableConfigurationProperties({**Properties.class}) 注解;

2)、@ConfigurationProperties 可以放在类或者方法上(在方法上与@Bean联合使用,此时就不用再在启动类上添加 @EnableConfigurationProperties 注解),在方法上就是给返回的 bean 对象进行参数绑定;

3)、@ConfigurationProperties 注解绑定参数支持使用默认值,如果配置文件中未指定,则使用默认值。

// properties 文件的配置
@Data
@PropertySource("config/db.properties")
public class TestProperties {@Value("${db.name}")private String name;
}
// yml 文件配置
@Data
@ConfigurationProperties(prefix = "test.param")
public class TestProperties {private String name;private Integer age;
}// 启动类上添加@EnableConfigurationProperties 将配置类导入容器
@SpringBootApplication
@Slf4j
@EnableConfigurationProperties({TestProperties.class})
public class AutoConfigurationTestApplication {public static void main(String[] args) {SpringApplication.run(AutoConfigurationTestApplication.class, args);}
}
2.3.4、配置参数类扫描

          @ConfigurationProperties 注解需要与 @EnableConfigurationProperties 注解结合使用,这种方式有些繁杂,可以在启动类上使用 @ConfigurationPropertiesScan 注解,就可以扫描所指定的包下的参数类,在 basePackages 参数中指定具体的包即可。

@SpringBootApplication
@Slf4j
@ConfigurationPropertiesScan(basePackages = {})
public class AutoConfigurationTestApplication {public static void main(String[] args) {SpringApplication.run(AutoConfigurationTestApplication.class, args);}
}
2.3.5、配置验证

        在进行参数绑定的时候,可以进行参数验证,保证绑定参数正常。引入以下依赖:

<dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId>
</dependency>

        在绑定参数的实体类上可以使用对应的校验注解,例如 @NotNull .....。

2.3.6、多个配置文件的优先级

        在 springboot 中使用的配置文件默认名称为:application.properties / application.yml

1)、项目直接启动:

配置文件位置优先级
项目根目录config文件夹下找配置文件(根目录是指和src目录同级)1
项目根目录下找配置文件(根目录是指和src目录同级)2
resources目录下找cofnig文件夹下找配置文件3
resources目录下找配置文件4

注意:

a、若同一个目录下有 .properties 文件和 yml 文件,会优先使用 .properties 文件。

b、springboot 会按照四个位置全部加载配置文件,如果高优先级的配置文件属性和低优先级的配置文件属性冲突,会使用优先级高的(使用第一次读到的),如果不冲突,则会共存互补。

2)、使用外部配置文件启动(使用 jar 包启动项目)

        springboot 打包时不会把项目根目录下的 ./config 和 ./ 这两级目录打包进去。这个设计很巧妙,因为没有打包进来,所以SpringBoot可以加载外部发配置文件
        springboot 支持把配置文件放在外部。只要把配置文件放在 jar 包的同级目录下,或者放在同级下的config文件夹中,springboot 都会去此处读取配置文件。

        命令行启动中,通过 --spring.config.location 参数指定配置文件的方式优先级最高,如果使用指定参数的形式(例如:--server.port),则使用此参数值。

注意:以上通过加载外部配置文件后,还会把 jar 包的 resources 目录下的配置也加载进来,相同属性使用优先级最高的。

2.3.7、使用指定的 profile 配置文件

        在上节中,四个位置指定的配置文件,可以在配置文件中指定生效的 profile,相应的配置文件命名方式为:application-${profile}.properties/yml。指定使用的 profile 使用配置:spring.profiles.active=*。

        在加载配置文件的时候,先加载不带 profile 的主配置文件,再加载带 profile 的配置文件,在主配置文件中使用 spring.profiles.active=*,指定使用哪个 profile 文件。

指定使用哪个 profile 的文件有以下几种方式:

        1)、在主配置文件中指定,使用 spring.profiles.active=*。

        2)、在命令行参数中指定:--spring.profiles.active=test。

        3)、虚拟机参数中指定:-Dspring.profiles.active=test。

2.3.8、单配置文件配置多个 profile

        yml 文件中使用 --- 符号分隔,properties 文件使用 #--- 符号分隔。需要注意以下几点:

        1)、多个 profile 之间的分隔符不能有空格,并且分隔符要连续。

        2)、分隔符前、后一行不能是注释行。

        3)、单配置文件配置多个 profile,不能被 @PropertySource 等注解加载。

以 yml 文件为例:

spring:profiles:active: prod  #指定需要切换的环境,文件优先
---
spring:profiles: dev  #指定属于哪个环境
---
spring:profiles: prod  #指定属于哪个环境
2.3.9、指定 profile 加载对象

        profile 不仅可以激活配置类,还可以激活 java 对象,使用 @Profile 注解。

注意:

1)、在使用 @Component 和 @Configuration 注解时,可以直接把 @Profile 注解放到类上;

2)、用在 @ConfigurationProperties 注解上,如果使用包扫描的方式加载配置类可以直接使用 @Profile 注解;如果使用的是 @EnableConfigurationProperties, 需要将 @Profile 注解用在 @EnableConfigurationProperties 注解上。

3、总结

        本文详细介绍 springboot 加载配置,绑定配置,指定 profile 配置等功能,掌握 springboot 的配置使用,对于深入了解自动配置原理有着巨大帮助。

        本人是一个从小白自学计算机技术,对运维、后端、各种中间件技术、大数据等有一定的学习心得,想获取自学总结资料(pdf版本)或者希望共同学习,关注微信公众号:it自学社团。后台回复相应技术名称/技术点即可获得。(本人学习宗旨:学会了就要免费分享)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/642544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程线程知识

一 初识linux线程 1 线程由来 我们之前说创建一个进程&#xff0c;要创建进程控制块pcb&#xff0c;进程地址空间&#xff0c;页表&#xff0c;而且我之前的博客中都有意无意的说明这个pcb是描述进程的&#xff0c;是os用来管理进程的&#xff0c;而有了线程后&#xff0c;就要…

Python基础第八篇(Python异常处理,模块与包)

文章目录 一、了解异常二、捕获异常&#xff08;1&#xff09;.异常案例代码&#xff08;2&#xff09;.读出结果 三、异常的传递&#xff08;1&#xff09;.异常传递案例代码&#xff08;2&#xff09;.读出结果 四、Python模块&#xff08;1&#xff09;.模块的导入&#xff…

大模型+自动驾驶

论文&#xff1a;https://arxiv.org/pdf/2401.08045.pdf 大型基础模型的兴起&#xff0c;它们基于广泛的数据集进行训练&#xff0c;正在彻底改变人工智能领域的面貌。例如SAM、DALL-E2和GPT-4这样的模型通过提取复杂的模式&#xff0c;并在不同任务中有效地执行&#xff0c;从…

k8s使用ingress实现应用的灰度发布升级

v1是1.14.0版本nginx ,实操时候升级到v2是1.20.0版本nginx&#xff0c;来测试灰度发布实现过程 一、方案&#xff1a;使用ingress实现应用的灰度发布 1、服务端&#xff1a;正常版本v1&#xff0c;灰度升级版本v2 2、客户端&#xff1a;带有请求头versionv2标识的请求访问版…

【MySQL】一文总结MVCC多版本并发控制

目录 MVCC 介绍当前读和快照读当前读快照读 MVCC 原理解析隐式字段Undo Log版本链Read ViewRead View 可见性原则 RC 和 RR 下的 Read ViewRC 下的 Read ViewRR 下的 Read View小结RR 级别下能否防止幻读总结 MVCC 介绍 在当今高度并发的数据库环境中&#xff0c;有效的并发控…

超级管理员权限绕过windows登录windows命令

文章目录 一、设置超级管理员权限二、绕过windows登录界面三、windows命令 一、设置超级管理员权限 查看本机的用户列表&#xff1a;net user激活超级用户&#xff1a;net user administrator /active:yes为超级用户设置密码&#xff1a;net user administrator 123(password)…

Redis 高可用之主从复制

1、简介 在 Redis 中&#xff0c;主从复制就是多个节点进行数据同步&#xff0c;在这些节点中&#xff0c;有 Master 和 slave 两个角色&#xff0c;Master 以写为主&#xff0c;slave 以读为主&#xff0c;当 Master 数据变化的时候&#xff0c;会自动将新的数据同步到其他的 …

StableDiffusion新版汉化

新旧版不同&#xff0c;这里以新版为例&#xff0c;用的是带链接&#xff0c;可以更新的方法。 步骤&#xff1a; 1.找到这个位置&#xff0c;依次点击&#xff0c;注意选项。 2.点击加载&#xff0c;等待刷新。 ctrlF搜索 zh_CN Localization 右边点击install&#xff0c…

外包干了4个月,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

GAMES101-Assignment8

一、总览 1.1 连接绳子的约束 在rope.cpp 中, 实现Rope 类的构造函数。这个构造函数应该可以创建一个 新的绳子(Rope) 对象&#xff0c;该对象从start 开始&#xff0c;end 结束&#xff0c;包含num_nodes 个节点。也就是如下图所示&#xff1a; 每个结点都有质量&#xff…

【论文阅读】Automated Runtime-Aware Scheduling for Multi-Tenant DNN Inference on GPU

该论文发布在 ICCAD’21 会议。该会议是EDA领域的顶级会议。 基本信息 AuthorHardwareProblemPerspectiveAlgorithm/StrategyImprovment/AchievementFuxun YuGPUResource under-utilization ContentionSW SchedulingOperator-level schedulingML-based scheduling auto-searc…

Rustdesk 中VP8 / VP9 / AV1 是什么?

环境&#xff1a; Rustdesk1.1.9 VP8 / VP9 / AV1 问题描述&#xff1a; VP8 / VP9 / AV1 是什么&#xff1f; 解决方案&#xff1a; 1.VP8、VP9和AV1是视频编解码器&#xff0c;用于压缩和解压缩视频数据。它们是由Google和Alliance for Open Media&#xff08;AOM&#…

011 变量

变量的定义 注意事项 作用域 类变量&#xff1a;定义在类中的变量&#xff0c;类的整个生命周期内可用实例变量&#xff1a;定义在类中的变量&#xff0c;类的实例可以使用局部变量&#xff1a;定义在方法中的变量&#xff0c;仅在方法内可以使用 class Dog{// 类变量static …

机器学习 | 深入理解并掌握核心概念

在如今数字化时代的浪潮下&#xff0c;机器学习已经成为人工智能领域的璀璨明星。它像一面魔镜&#xff0c;赋予计算机系统学习和改进的能力&#xff0c;让机器能够从海量数据中提取规律、预测未来&#xff0c;甚至做出智能决策。本 专栏 将带您踏上机器学习的奇妙之旅&#xf…

题解:CF1920E. Counting Binary Strings

题解&#xff1a;CF1920E. Counting Binary Strings 题意简述 题目链接&#xff1a;Problem - E - Codeforces。 洛谷翻译&#xff1a;Counting Binary Strings - 洛谷。 思路解析 假设我们有一个01串str&#xff08;设里面有z个“1”&#xff09;&#xff0c;我们要求它里…

【MySQL进阶】视图_存储过程_存储函数_触发器

文章目录 视图基本介绍视图操作视图创建视图查询视图修改视图删除 存储过程基本介绍基本操作存储语法变量IF语句参数传递CASEWHILEREPEATLOOP游标 存储函数触发器基本介绍基本操作 总结 视图 基本介绍 视图概念&#xff1a;视图是一种虚拟存在的数据表&#xff0c;这个虚拟的表…

透明拼接屏在汽车领域的应用

随着科技的进步&#xff0c;透明拼接屏作为一种新型的显示技术&#xff0c;在汽车领域的应用越来越广泛。尼伽小编将围绕透明拼接屏在汽车本身、4S店、展会、工厂等方面的应用进行深入探讨&#xff0c;并展望未来的设计方向。 一、透明拼接屏在汽车本身的应用 车窗显示&#x…

Python入门(一)

anaconda安装 官网&#xff1a;https://www.anaconda.com下载 jupyter lab 简介&#xff1a; 包含了Jupyter Notebook所有功能。 JupyterLab作为一种基于web的集成开发环境&#xff0c;你可以使用它编写notebook&#xff0c;操作终端&#xff0c;编辑markdown文本&#xf…

Linux中文件属性的获取(stat、chmod、Istat、fstat函数的使用)

修改文件权限 函数如下&#xff1a; chmod/fchmod函数用来修改文件的访问权限: #include <sys/stat.h> int chmod(const char *path, mode_t mode); int fchmod(int fd, mode_t mode); 成功时返回0&#xff1b;出错时返回EOF 注意&#xff1a;在vmware和windows共享的文…

NetSuite 文心一言(Ernie)的AI应用

有个故事&#xff0c;松下幸之助小时候所处的年代是明治维新之后&#xff0c;大量引用西洋技术的时期。当时大家对“电”能干什么事&#xff0c;充满好奇。“电能干什么&#xff1f;它能帮我们开门么&#xff1f;” 松下幸之助的爷爷对电不屑&#xff0c;于是就问他。松下幸之助…