SpringBoot注解---00.配置文件
改变默认配置Spring Boot使用一个全局的配置文件
- application.properties
- application.yml
配置文件放在src/main/resources目录或者类路径/config下
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好。
一、yaml
1.简介
.yml是YAML(YAML Ain't Markup Language)语言的文件,以数据为中心,比json、xml更适合做配置文件
YAML | XML | ||||
|
|
2.语法
2.1 基本写法
① k:(空格)v:表示一对键值对(空格必须有);
②以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的。
③ 属性和值是大小写敏感
④ '#'表示注释
⑤ 缩进不允许使用tab,只允许空格
2.2 数据类型支持
①字面量:普通的值(数字、字符串、布尔)
字面直接来写:k: v
字符串默认不用加上单引号或者双引号
"":双引号;不会转移字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name:"zhangsan \n lisi" --> 输出:zhangsan 换行 lisi
'':单引号,会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name:'zhangsan \n lisi' --> 输出:zhangsan \n lisi
②对象、Map(属性和值)(键值对)
k: v:在下一行来写对象的属性和值的关系,注意缩进
对象还是k: v的方式;
1 2 3 | friends: lastName:zhangsan age: 20 |
行内写法:
1 | friends: {lastName: zhangsan,age: 20 } |
③数组(List,Set)
用-值表示数组中的一个元素
1 2 3 4 | pets: - cat - dog - pid |
行内写法:
1 | pets: [cat,dog,pig] |
3.yaml配置文件值注入
3.1 javaBean
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定; * prefix = "person":配置文件中哪个下面的所有属性进行一一映射 * * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能; * */ @Component @ConfigurationProperties (prefix = "person" ) @Validated //数据校验 public class Person { //@Email(加上注解后限制lastName必须是邮箱格式) private String lastName; private Integer age; private Boolean boss; private Date birth; private Map<String,Object> maps; private List<Object> lists; private Dog dog; |
3.2 配置文件注入属性
1 2 3 4 5 6 7 8 9 10 11 12 | person: lastName: hello age: 18 boss: false birth: 2017 / 12 / 12 maps: {zhangsan: 23 ,wangwu: 25 } lists: - lisi - zhaoliu dog: name: 小狗 age: 12 |
1 2 3 4 5 6 | <!--在项目Pom中导入配置文件处理器,配置文件进行绑定就会有提示--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional> true </optional> </dependency> |
3.3 注解@Value注入属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @Component public class Person { @Value ( "${person.name:HelloWorld!}" ) private String lastName; @Value ( "#{11*2}" ) private Integer age; @Value ( "true" ) private Boolean boss; //复杂类型无法封装 private Map<String,Object> maps; private List<Object> lists; private Dog dog; |
3.4 @Value获取值和@ConfigurationProperties获取值比较
@ConfigurationProperties | @Value | ||
功能 |
批量注入配置文件中的属性
|
一个个指定 | |
松散绑定(松散语法) | 支持 | 不支持 |
|
SpEL(表达式) | 不支持 | 支持 | |
JSR303数据校验 | 支持 | 不支持 | ![]() |
复杂类型封装 | 支持 | 不支持 |
配置文件yml和properties都能获取到值,若我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,用@Value;若我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties
3.5 @PropertySource&@ImportResource&@Bean
① @PropertySource:加载指定的配置文件
1 2 3 4 5 6 7 8 9 10 11 | #person.properties文件 person.last-name=李四 person.age= 12 person.birth= 2017 / 12 / 15 person.boss= false person.maps.k1=v1 person.maps.k2= 14 person.lists=a,b,c person.dog.name=dog person.dog.age= 15 |
1 2 3 4 5 6 7 8 9 | @PropertySource (value = { "classpath:person.properties" }) //类路径下加载属性 @Component @ConfigurationProperties (prefix = "person" ) //@Validated public class Person { private String lastName; private Integer age; private Boolean boss; |
② @ImportResource:导入Spring的配置文件,让配置文件里面的内容生效
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件不能被自动识别,想让Spring的配置文件生效(加载进来),@ImportResource标注在一个配置类上
1 2 3 4 5 6 7 8 | @ImportResource (locations = { "classpath:beans.xml" }) //导入Spring的配置文件让其生效 @SpringBootApplication public class SpringBoot02ConfigApplication { public static void main(String[] args) { SpringApplication.run(SpringBoot02ConfigApplication. class , args); } } |
1 2 3 4 5 6 7 | <?xml version= "1.0" encoding= "UTF-8" ?><!--beans.xml配置文件--> <beans xmlns= "http://www.springframework.org/schema/beans" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" > <bean id= "helloService" class = "com.atguigu.springboot.service.HelloService" ></bean> </beans> |
③ @bean
SpringBoot推荐给容器中添加组件的方式;推荐使用全注解的方式
- 配置类@Configuration------>Spring配置文件
- 使用@Bean给容器中添加组件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /** * @Configuration:指明当前类是一个配置类;用来替代之前的Spring配置文件 * * 以前在配置文件中用<bean><bean/>标签添加组件 * */ @Configuration public class MyAppConfig { //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名 @Bean public HelloService helloService02(){ System.out.println( "配置类@Bean给容器中添加组件了..." ); return new HelloService(); } } |
4.propertyies配置文件值获取
① RandomValuePropertySource:配置文件可以使用强随机数
{random.int}、{random.int(10)}、${random(1024,65536)}
② 属性配置占位符
1 2 | app.name=MyApp app.description=${app.name} is a Spring boot applicatio |
- 可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用)
- ${app.name:默认值}来指定找不到属性时的默认值。
5.Profile多环境支持
Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境。
① 多profile文件形式
- 形式:application-{profile}.properties
application-dev.properties、application-prod.properties
② 多profile文档块模式
③ 激活方式
- 命令行 java -jar xxx.jar --spring.profile.active=dev
- 配置文件 spring.profile.active=dev
- jvm参数 -Dspring.profiles.active=dev
6.配置文件加载位置
spring boot启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
- file:./config/
- file:./
- classpath:/config/
- classpath:/
以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容,形成“互补配置”。
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置。
1 2 3 4 5 6 7 | server.port: 8094 #配置项目的访问路径 server.context-path: /nxf #改变默认配置 spring.config.location: D:/8_code_LogQuerySystem/nxf/application.yml |
7.外部配置加载顺序
SpringBoot也可以从以下位置加载配置;优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置。
1.命令行参数
java -jar xxx.jar --server.port=8087 --server.context-path=/abc
多个配置用空格分开;--配置项-值
6-9.由jar包外向jar包内进行寻找:
优先加载带profile:6-7
再来加载不带profile:8-9
8.自动配置原理
参考链接:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
2018-11-30 pandas中的axis=0,axis=1,傻傻分不清楚
2018-11-30 numpy排序(sort、argsort、lexsort、partition、sorted)
2018-11-30 numpy的prod()函数和pad()函数