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,一经查实,立即删除!

相关文章

904. 虫洞(spfa判断负环模板题)

904. 虫洞 - AcWing题库 农夫约翰在巡视他的众多农场时&#xff0c;发现了很多令人惊叹的虫洞。 虫洞非常奇特&#xff0c;它可以看作是一条 单向 路径&#xff0c;通过它可以使你回到过去的某个时刻&#xff08;相对于你进入虫洞之前&#xff09;。 农夫约翰的每个农场中包…

进程线程知识

一 初识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;有效的并发控…

Element中的el-table中如何获取每一行的id

只需要用<template slot-scope"scope"></template >标签包裹起来即可 使用scope.row.列名&#xff0c;的方式获取当前行对应列的值 可以通过使用作用域插槽的方式获取每一行的id。以下是一个示例代码&#xff1a; <el-table-column prop"statu…

超级管理员权限绕过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;会自动将新的数据同步到其他的 …

C语言联合体(Union)在实战中的使用技巧

联合体&#xff08;Union&#xff09;是一种特殊的数据结构&#xff0c;允许在同一内存位置存储不同的数据类型。联合体在实战中可以用于一些特定的场景&#xff0c;具有一些使用技巧&#xff0c;以下是一些常见的实战中使用技巧&#xff1a; 1.节省内存空间&#xff1a; 联合…

如何优雅的使用 if else

作为一个程序员在开发中 if else 判断在代码中是必不可少的&#xff0c;但是 if else 判断使用多了嵌套多了不利于代码维护&#xff0c;看起来也头疼难以理解&#xff0c;接下来以为大家介绍一下我是怎么避免过多冗余的 if else 嵌套的。 0. 嵌套的if语句的典型用例 在最终执…

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;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

Thin-LUN使用vdbench测试性能如何预埋数据

一、功能需求 Thin-LUN性能测试过程中&#xff0c;由于刚创建的THIN-LUN需要预埋数据&#xff0c;才能准确测试出实际性能&#xff0c;所以在第一次性能测试之前&#xff0c;需要使用vdbench预埋数据 二、组网图 无 三、配置步骤 seekpcteof 测试性能时&#xff0c;如果读…

GAMES101-Assignment8

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

洛谷P3392 涂国旗-----暴力美学的演绎

# 涂国旗 ## 题目描述 某国法律规定&#xff0c;只要一个由 $N \times M$ 个小方块组成的旗帜符合如下规则&#xff0c;就是合法的国旗。&#xff08;毛熊&#xff1a;阿嚏——&#xff09; - 从最上方若干行&#xff08;至少一行&#xff09;的格子全部是白色的&#xff1b…

【论文阅读】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…

CGAL 网格连通聚类

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里的思路其实与点云的欧式聚类非常类似,区别在于点云的欧式聚类是通过搜索半径对点云进行聚类,至于基于连通性网格面片聚类则是通过面片的邻近关系对面片进行聚类,大致的过程与欧式聚类是相同的: 首先,需要指…

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 …