首页 > 其他分享 >Spring Boot配置文件(yaml&properties)总结

Spring Boot配置文件(yaml&properties)总结

时间:2023-09-11 15:02:29浏览次数:57  
标签:配置文件 自定义 Spring 配置 Boot application yml

Spring Boot 配置文件总结 (qq.com)

Spring Boot 的两种配置文件 (qq.com)

Spring Boot 中提供一个全局的配置文件:application.properties,这个配置文件的作用就是,允许我们通过这个配置文件去修改 Spring Boot 自动配置的默认值

Spring Boot 支持两种格式的配置文件:application.propertiesapplication.yml

yml 等同于 yaml,写法看个人喜欢,我喜欢写成 application.yml

配置文件位置与优先级

SpringBoot 配置加载顺序和属性优先级 (qq.com)

Spring Boot默认会从以下位置加载 application.propertiesapplication.yml 文件(只考虑一个存在),后加载的会覆盖先加载的键:

  1. 项目根目录的 /config 子目录
  2. 项目根目录
  3. classpathresources )下的/config子目录
  4. classpathresources )根目录

图片

文件名遵循以下原则

bootstrap > bootstrap-{profile} > application > application-{profile}

bootstrap主要用于Spring Cloud环境,加载外部配置。

文件类型遵循以下原则

.properties > .yml > .yaml

不同后缀不同写法

application.propertiesapplication.yml ,它们的区别在于语法不同,但本质上是一样的。application.properties 使用键值对的方式来配置,而 application.yml使用缩进和冒号的方式来配置。

properties

properties 作为后缀的配置文件,语法是这样的:key = value,如果有多级配置项,则是 first.second.third = value

key=value
first.second.third=value

示例:

定义属性:

key=value
game.name=GTA5

这里的 keygame.name 都是属性名称,而 valueGTA5 是属性的

定义 List:

game.list=GTA5,NBA2K,AC

这里的 game.list 这个列表包含了 3 个元素。

定义 Map:

game.map.key1=value1
game.map.key2=value2

这里的 game.map 是一个 Map,这个 Map 包含了两个元素,key1 映射到 value1,key2 映射到 value2

引用已定义的属性:

game.name=GTA5
# 引用上面已定义的属性
great.game=${game.name}

yml (yaml)

yml 作为后缀的配置文件,语法是这样的:key: value。使用冒号代替等号,同时冒号后面需要跟上一个空格符,不可省略。

key: value
first:
  second:
    third: value

示例:

定义属性:

key: value
game:
  name: GTA5

定义 List:

game:
  list:
    - GTA5
    - NBA2K
    - AC

定义 Map:

game:
  map:
    key1: value1
    key2: value2

引用已定义的属性:

game:
  name: GTA5
great:
  game: @{game.name}

不同环境下切换不同配置文件

一般项目中在不同环境下都有不同的配置,以这个 Tomcat 的端口号为例:

目前有 3 个环境,分别是开发环境、测试环境、生产环境。在开发环境下,端口号是 4790;测试环境下,端口号是 4791;生产环境下是 4792。

application-dev.yml
server:
  port: 4790
application-test.yml
server:
  port: 4791
application-prod.yml
server:
  port: 4792

spring.profiles.active

现在,通过 spring.profiles.active 这个配置项,在 application.yml 中指定我们想要切换的配置文件,现在指定使用开发环境的配置文件

# 指定使用 application-dev.yml 这个配置文件
spring:
  profiles:
    active: dev

启动 Spring Boot 应用,控制台输出:

2023-03-16 15:41:48.122  INFO 3356 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 4790 (http) with context path ''

指定使用测试环境下的配置文件

# 指定使用 application-test.yml 这个配置文件
spring:
  profiles:
    active: test

启动 Spring Boot 应用,控制台输出:

2023-03-16 15:42:21.462  INFO 24548 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 4791 (http) with context path ''

同理,指定使用生产环境的配置文件也是一样的做法。


@Profile注解,该注解用于指定只用在某个profile激活时才装配该Bean。

比如有时我们希望在不同的环境下使用不同的datasource,此时就需要@Profile注解发挥作用了。如下示例,我们希望在开发环境使用内嵌的数据库,但是在线上环境使用MySQL数据库,我们就可以像这样定义configuration:

	@Bean(name="dataSource")
    @Profile("dev")
    public DataSource embeddedDataSource() {
      return new EmbeddedDatabaseBuilder()
              .setType(EmbeddedDatabaseType.H2)
              .addScript("classpath:schema.sql")
              .addScript("classpath:test-data.sql")
              .build();
    }
    @Bean(name="dataSource")
    @Profile("prod")
    public DataSource hikariDataSource() {
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setDriverClassName("com.mysql.jdbc.Driver");
        hikariConfig.setJdbcUrl(hikaricpUrl);
        hikariConfig.setUsername(hikaricpUsername);
        hikariConfig.setPassword(hikaricpPassword);
        hikariConfig.setAutoCommit(true);
        hikariConfig.setTransactionIsolation("TRANSACTION_READ_COMMITTED");
        hikariConfig.setConnectionTimeout(5000);
        hikariConfig.setIdleTimeout(600000);
        hikariConfig.setMaxLifetime(1800000);
        hikariConfig.setMaximumPoolSize(5);
        hikariConfig.addDataSourceProperty("cachePrepStmts", "true");
        hikariConfig.addDataSourceProperty("prepStmtCacheSize", "250");
        hikariConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        hikariConfig.addDataSourceProperty("allowMultiQueries", "true");
        HikariDataSource dataSource = new HikariDataSource(hikariConfig);
        return dataSource;
    }

读取自定义配置

在 Spring Boot 项目中,自定义配置是经常用到的,我目前体会到的自定义的配置的作用有一点:配置与代码解耦

下面,我们看看如何自定义配置,并使用自己自定义配置的值:

server:
  port: 4790

# 自定义的配置
demo:
  author: god23bin
  description: 点个免费的赞,我能开心好久!

上面自定义了两个配置项,分别是 demo.authordemo.description,接着,如何在代码中使用这些配置好的值呢?

目前使用这些配置好的值(读取这些值),有以下几种方式:

  • 使用 @Value
  • 使用 @ConfigurationProperties

@Value

我们写一个普通的 Java 类,使用 Spring 提供的 @Value 来读取这两个值:

@Data
@Component
public class DemoCustomConfig {

    /**
     * 通过 @Value 注解读取配置文件中的自定义配置项的值,使用 ${} 进行读取
     **/
    @Value("${demo.author}")
    private String author;

    @Value("${demo.description}")
    private String description;

}

上面的代码中,我在类上使用了 @Data@Component@Data 是来自 Lombok 的,用于生成 getter 和 setter 方法,@Component 则将该类的实例对象交给 Spring 管理,接着在该类的两个属性上分别使用了 @Value 注解,通过 ${} 指定了我们要读取的配置项。

进行测试,我们写一个 Controller 判断我们的读取是否成功:

@RequestMapping("/demo")
@RestController
public class DemoController {

    @Autowired
    private DemoCustomConfig demoCustomConfig;

    @GetMapping("/getCustomValue")
    public ResponseEntity<String> getCustomValue() {
        return ResponseEntity.ok(demoCustomConfig.getAuthor() + "说:" + demoCustomConfig.getDescription());
    }
}

访问该接口:localhost:4790/demo/getCustomValue

图片

@ConfigurationProperties

@ConfigurationProperties 注解,它可以将配置文件中的的值绑定到 Java Bean 中,也就是通过这个 Bean 可以读取到配置文件中配置的值,我们看看如何操作。

我们自定义一个用于读取配置文件中配置项的类:

@Data
@Component
@ConfigurationProperties(prefix="system.demo")
public class SystemCustomConfig {

    private String name;
    private String version;

}

上面的代码,主要使用了 @ConfigurationProperties 这个注解,并指定了前缀 system.demo,同时这个类有两个属性,name 和 version, 这样就相当于我们自定义了 system.demo.namesystem.demo.version 这两个属性。

接着,我们就能在配置文件中写这两个我们自定义的配置项了:

server:
  port: 4790

# 自定义的配置
system:
  demo:
    name: 超级系统
    version: 1.0

写完这里的配置项,并不需要使用 @Value 去读取,因为使用了 @ConfigurationProperties 注解,Spring 已经帮我们搞定了配置的值的读取,至于它的实现原理,这里先不深究。

进行测试,依然通过写一个接口来测试我们通过:

@RequestMapping("/demo")
@RestController
public class DemoController {

    @Autowired
    private SystemCustomConfig systemCustomConfig;

    @GetMapping("/getSystemVersion")
    public ResponseEntity<String> getSystemVersion() {
        return ResponseEntity.ok(systemCustomConfig.getName() + "版本:" + systemCustomConfig.getVersion());
    }
}

访问该接口:localhost:4790/demo/getSystemVersion

图片

自定义配置文件读取

上面说的是自定义的配置

现在这里说自定义的配置文件

我们知道 Spring Boot 默认提供 application.properties 这个配置文件。那现在我们想自己写一个配置文件,并且能在应用中读取这个配置文件的信息,该如何做呢?这里就涉及到 @PropertySource 这个注解了。

自定义的配置文件:

custom.yml

# 自定义的配置文件
version: 2.0
description: 求关注!

读取该配置文件的配置类:

@Data
@Configuration
@PropertySource("classpath:custom.yml")
public class DemoPropertiesSourceConfig {

    @Value("${version}")
    private String version;

    @Value("${description}")
    private String description;

}

这样,就能读取到自己编写的配置文件的配置信息了。

如果有多个自定义的配置文件,那么可以使用 @PropertySources 注解,可以看到最后面多加了一个 s ,说明这个单词是复数,通俗易懂。

@Configuration
@PropertySources({
    @PropertySource("classpath:custom1.yml"),
    @PropertySource("classpath:custom2.properties")
})
public class MyConfig {
    // ...
}

自动提示打开

有个问题是:我们自己写了个 Java Bean 后,在配置文件中写配置项的时候并没有相关提示,这个就比较不友好,如果当我们自己写的配置想要给其他人用的话,别人都不知道有什么配置可以配。所以想要能像 Spring Boot 提供的配置提示一样的话,就需要引入下面的依赖:

<!-- 配置文件处理器,配置文件进行绑定就会有提示 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

spring-boot-configuration-processor 是一个用于生成配置元数据的注解处理器。它会扫描使用 @ConfigurationProperties 注解的类和方法,来获取配置参数并生成配置元数据。生成的配置元数据可以用于 IDE 的自动补全和提示功能。

图片

如果你引入了这个依赖并且重启该 Spring Boot 项目后,依旧没有提示的话,尝试开启 IDEA 中的 annotaion processing

图片

关于 Cannot resolve configuration property

对于我们自定义的配置,会出现这样的提示:Cannot resolve configuration property(无法处理自定义的配置属性),如下:

图片

解决方式就是定义一下元数据,用元数据来描述这个属性。当我们移动到这个配置项上时,出现提示,我们直接点击 Define configuration key xxx 就可以帮我们生成一个关于配置的元数据文件。

additional-spring-configuration-metadata.json

{
  "properties": [
    {
      "name": "demo.author",
      "type": "java.lang.String",
      "description": "Demo的作者"
    },
    {
      "name": "demo.description",
      "type": "java.lang.String",
      "description": "Demo的描述"
    }
  ]
}

此时,还是一样,重启项目,如果黄色提示还是没有去除的话,这里建议重新用 Maven 进行一次 clean,接着重新编译整个项目,就可以了。于此同时,也具有了自动提示功能。

图片

标签:配置文件,自定义,Spring,配置,Boot,application,yml
From: https://blog.51cto.com/coderge/7436004

相关文章

  • springcloud日常学习
    一、 Ribbon客户端负载均衡1. 负载均衡介绍  ① LB,即负载均衡(LoadBalance),负载均衡是微服务架构中经常使用的一种技术。负载均衡是我们处理高并发、缓解网络压力和进行服务端扩容的重要手段之一,简单的说就是将用户的请求平摊的分配到多个服务上,从而实现系统的高可用性集群。......
  • Spring AOP概念全面解析
    1AOP简介思考:什么是AOP,AOP的作用是什么?1.1AOP简介和作用【理解】AOP(AspectOrientedProgramming)面向切面编程,一种编程范式,指导开发者如何组织程序结构OOP(ObjectOrientedProgramming)面向对象编程作用:简单的说就是在不改变方法源代码的基础上对方法进行功能增强。符合Sprin......
  • Spring源码分析(七)容器的扩展点(FactoryBean)
    在上篇文章中我已经对容器的第一个扩展点(BeanFactoryPostProcessor)做了一系列的介绍。其中主要介绍了Spring容器中BeanFactoryPostProcessor的执行流程,以及Spring自身利用了BeanFactoryPostProcessor完成了什么功能,对于一些细节问题可能说的不够仔细,但是当前阶段我想要做的......
  • 使用Spring Boot构建高性能的Java后端应用
    引言在现代应用程序开发中,构建高性能的后端服务是至关重要的。SpringBoot是一种流行的Java框架,可以帮助开发者快速构建高性能的后端应用。本博客将深入探讨如何使用SpringBoot来构建高性能的Java后端应用,并提供实际的代码示例。SpringBoot简介SpringBoot是SpringFramework......
  • 使用gradle的方式进行Springboot3的web开发(微服务版)
    简要:最近看了很多的Springboot3的项目,但是发现很多都是用maven来进行版本管理的,很少有用gradle来管理的,通过网上查找资料,看视频,终于自己写一个gradle管理的Springboot3的项目 第一步:创建项目注意:JDK的版本必须要在17或者以上。 第二步:设置gradle仓库 第三步:创建项目......
  • SpringBoot上传文件
    application.yaml配置上传路经,其实写在哪都行无所谓,就是引入配置文件,@Values注解赋值web:#绝对路经upload-path:D://test/springservlet:multipart:enabled:true#单个文件的最大上限max-file-size:1024MB#单个请求的文件总大......
  • SpringBoot跨域访问
    没有引入SpringSecuity的情况Christopher2021.10.23CORS后端跨域CORS是一种访问机制,Cross-OriginResourceSharing,跨域资源共享,通过在服务器端设置相应头,把发起跨域的原始域名添加到Access-Control-Allow-Origin中即可。何为跨域域,即域名,跨域,即从域名A申请访......
  • 关于spring的注解作用(springboot相较于spring 的不同)
      springboot的@Bean注解作用在方法上,它会将这个方法返回的类型实例注入spring容器。  <bean>标签代表一个实例(或对象),而不是一个类型。在Spring中,<bean>标签用于声明和配置一个bean实例。当我们在XML配置文件中使用<bean>标签时,我们定义的是一个具体的b......
  • 分享一个 SpringBoot + Redis 实现「查找附近的人」的小技巧
    前言SpringDataRedis提供了十分简单的地理位置定位的功能,今天我就用一小段代码告诉大家如何实现。正文1、引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>2、更......
  • SpringBoot + 自定义注解,实现用户操作日志(支持SpEL表达式)
    背景一个成熟的系统,都会针对一些关键的操作,去创建用户操作日志。比如:XX人创建了一条订单,订单号:XXXXXXXXX因为操作人或者订单号是动态的,所以有些开发人员,不知道获取,就将这种操作日志和业务代码融在一起。我们当然要杜绝这种现象,一定会有更好的解决方案。当前项目除了......