【Spring Boot 入门二】Spring Boot中的配置文件 - 掌控你的应用设置

news2024/11/18 23:32:50

在这里插入图片描述

一、引言

在上一篇文章中,我们开启了Spring Boot的入门之旅,成功构建了第一个Spring Boot应用。我们从环境搭建开始,详细介绍了JDK的安装以及IDE的选择与配置,然后利用Spring Initializr创建了项目,分析了项目结构,还编写了第一个简单的API并深入理解了自动配置。这一系列的操作让我们初步领略了Spring Boot在快速构建Java应用方面的强大能力。

配置文件就像是Spring Boot应用的指挥中心,它掌控着应用的各种设置。无论是定义服务器的运行参数,还是连接数据库的详细信息,又或是自定义的业务逻辑相关的属性,都离不开配置文件。合理地配置这些文件,可以让我们的应用在不同的环境(如开发环境、测试环境、生产环境)中灵活运行,同时也方便我们对应用进行定制化和维护。

二、Spring Boot配置文件的类型

1. application.properties文件

  • 基本语法和格式
    • application.properties文件采用键值对(key - value)的形式来设置配置项。每一行代表一个配置项,格式为key=value。例如,要设置服务器的端口号为8080,可以写成server.port=8080。这里的server.port就是键(key),8080就是值(value)。键是固定的配置项名称,Spring Boot会根据这些键来识别对应的配置内容。值则根据具体的配置需求而定,可以是数字、字符串、布尔值等不同的数据类型。
    • 对于一些复杂的值,如列表或者映射,可能需要使用特定的格式。例如,要配置一个包含多个数据源的列表,可以使用逗号分隔的值,像spring.datasource.url=jdbc:mysql://localhost:3306/db1,jdbc:mysql://localhost:3306/db2
  • 常见配置项示例(如服务器端口、数据库连接等)
    • 服务器端口配置:除了上面提到的server.port,我们还可以配置服务器的上下文路径。例如,server.servlet.context - path=/myapp,这意味着我们的应用将在http://localhost:8080/myapp这个路径下运行。
    • 数据库连接配置:假设我们使用MySQL数据库,配置数据库连接的相关项包括spring.datasource.url=jdbc:mysql://localhost:3306/mydb(数据库的URL),spring.datasource.username=root(数据库用户名),spring.datasource.password=123456(数据库密码),spring.datasource.driver - class - name=com.mysql.cj.jdbc.Driver(数据库驱动类名)。这些配置项告诉Spring Boot如何连接到指定的数据库。

2. application.yml文件

  • YAML语法介绍
    • YAML(YAML Ain’t Markup Language)是一种简洁的数据序列化格式。它使用缩进表示层级关系,而不是像application.properties那样使用点号(.)。在YAML中,基本的数据结构有标量(如字符串、数字、布尔值)、列表和映射。
    • 字符串不需要使用引号包裹,除非字符串中包含特殊字符或者空格。例如,name: John是合法的字符串配置。对于布尔值,truefalse直接书写即可,如enabled: true
    • 列表使用短横线(-)开头,每个元素占一行。例如:
fruits:
  - apple
  - banana
  - cherry
  • 映射是键值对的集合,通过缩进表示层级关系。例如:
person:
  name: Tom
  age: 25
  address:
    city: New York
    street: 123 Main St
  • 对比application.properties,展示YAML的简洁性
    • 以配置服务器端口和数据库连接为例,在application.properties中我们需要这样写:
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver - class - name=com.mysql.cj.jdbc.Driver
  • application.yml中可以写成:
server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: 123456
    driver - class - name: com.mysql.cj.jdbc.Driver
  • 可以看到,YAML格式更加直观,尤其是对于复杂的嵌套结构,YAML的可读性更强。
    - 转换application.properties中的配置到application.yml
    • 假设我们有一个application.properties文件中的配置如下:
myapp.title=My Awesome App
myapp.version=1.0
myapp.settings.enabled=true
myapp.settings.timeout=30
  • 转换为application.yml文件的配置如下:
myapp:
  title: My Awesome App
  version: 1.0
  settings:
    enabled: true
    timeout: 30

三、自定义配置属性

1. 创建自定义配置类

  • 使用@ConfigurationProperties注解
    • 首先,我们创建一个Java类来表示我们的自定义配置。例如,我们创建一个名为AppConfig的类。在这个类中,我们可以定义各种属性来接收配置文件中的值。假设我们要配置一个邮件服务相关的设置,我们可以这样写:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "mail")
public class AppConfig {
    private String host;
    private int port;
    private boolean enabled;

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }
}
  • 这里的@ConfigurationProperties注解的prefix属性指定了在配置文件中对应的配置项的前缀。例如,在application.yml文件中,我们可以这样配置邮件服务:
mail:
  host: smtp.example.com
  port: 25
  enabled: true
  • 定义属性并设置默认值
    • 我们可以在自定义配置类中为属性设置默认值。例如,修改上面的AppConfig类:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "mail")
public class AppConfig {
    private String host = "smtp.default.com";
    private int port = 25;
    private boolean enabled = false;

    // 省略getter和setter方法
}
  • 这样,如果在配置文件中没有配置mail.hostmail.port或者mail.enabled,那么就会使用默认值。

2. 在配置文件中设置自定义属性的值

  • 不同数据类型(字符串、数字、布尔值等)的配置示例
    • 字符串类型:继续以邮件服务为例,如果要配置邮件的发件人地址,我们可以在application.yml中添加如下配置:
mail:
  sender: sender@example.com
  • AppConfig类中添加一个private String sender;属性以及对应的gettersetter方法,就可以接收这个配置值了。
    • 数字类型:假设我们要配置邮件发送的最大重试次数,在application.yml中:
mail:
  max - retry - times: 3
  • AppConfig类中添加private int maxRetryTimes;属性和相应的方法。
  • 布尔值类型:如果要配置是否开启邮件的加密传输,在application.yml中:
mail:
  use - ssl: true
  • AppConfig类中添加private boolean useSsl;属性和相关方法。
    - 多层嵌套属性的配置
    • 假设我们的邮件服务有更复杂的配置,比如不同类型邮件(如通知邮件、营销邮件)的发送设置。我们可以这样在application.yml中配置:
mail:
  notification:
    subject - prefix: "[Notification]"
    enabled: true
  marketing:
    subject - prefix: "[Marketing]"
    enabled: false
  • AppConfig类中,我们可以创建内部类来接收这些嵌套的配置:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "mail")
public class AppConfig {
    private NotificationConfig notification;
    private MarketingConfig marketing;

    public NotificationConfig getNotification() {
        return notification;
    }

    public void setNotification(NotificationConfig notification) {
        this.notification = notification;
    }

    public MarketingConfig getMarketing() {
        return marketing;
    }

    public void setMarketing(MarketingConfig marketing) {
        this.marketing = marketing;
    }

    public static class NotificationConfig {
        private String subjectPrefix;
        private boolean enabled;

        public String getSubjectPrefix() {
            return subjectPrefix;
        }

        public void setSubjectPrefix(String subjectPrefix) {
            this.subjectPrefix = subjectPrefix;
        }

        public boolean isEnabled() {
            return enabled;
        }

        public void setEnabled(boolean enabled) {
            this.enabled = enabled;
        }
    }

    public static class MarketingConfig {
        private String subjectPrefix;
        private boolean enabled;

        public String getSubjectPrefix() {
            return subjectPrefix;
        }

        public void setSubjectPrefix(String subjectPrefix) {
            this.subjectPrefix = subjectPrefix;
        }

        public boolean isEnabled() {
            return enabled;
        }

        public void setEnabled(boolean enabled) {
            this.enabled = enabled;
        }
    }
}

四、配置文件的加载顺序

1. 不同位置的配置文件加载优先级

  • 项目根目录下的配置文件
    • 当Spring Boot应用启动时,它会首先查找项目根目录下的application.properties或者application.yml文件。这个位置的配置文件具有较高的优先级,可以用于覆盖默认的配置。例如,如果我们在项目根目录下的application.yml中设置了server.port=8090,那么这个配置将会优先于其他位置的相同配置项被加载。
  • 类路径下的配置文件
    • 如果项目根目录下没有找到配置文件,Spring Boot会在类路径(classpath)下查找application.properties或者application.yml文件。类路径下的配置文件是默认的配置来源。通常,我们在创建Spring Boot项目时,在resources文件夹下的application.yml或者application.properties就是类路径下的配置文件。这里的配置项会被加载,如果项目根目录下没有覆盖这些配置的话。
  • 外部配置文件(如通过命令行指定)
    • Spring Boot还支持通过命令行指定外部配置文件。例如,我们可以在启动应用时使用--spring.config.location=file:/path/to/external - config/application.yml这样的命令行参数来指定外部配置文件的位置。外部配置文件的优先级最高,它可以覆盖项目根目录和类路径下的相同配置项。

2. 利用加载顺序进行灵活配置

  • 覆盖默认配置的示例
    • 假设我们在类路径下的application.yml中有默认的数据库连接配置:
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/defaultdb
    username: defaultuser
    password: defaultpassword
  • 在开发环境中,我们可能需要连接到本地的测试数据库。我们可以在项目根目录下创建一个application.yml文件,只包含需要覆盖的配置项:
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/testdb
    username: testuser
    password: testpassword

这样,当在开发环境中启动应用时,就会使用项目根目录下的配置文件中的数据库连接配置,而不是类路径下的默认配置。

五、配置文件与不同环境(dev、prod等)

1. 多环境配置的概念

  • 为什么需要多环境配置
    • 在软件开发过程中,我们通常会经历多个不同的环境,如开发环境(dev)、测试环境(test)、生产环境(prod)等。不同的环境可能需要不同的配置。例如,在开发环境中,我们可能使用本地的轻量级数据库,并且日志级别设置为DEBUG以便于调试;而在生产环境中,我们会使用正式的数据库服务器,并且日志级别可能设置为INFO或者WARN以减少日志输出量,提高性能。多环境配置可以让我们在不同的环境中轻松切换应用的配置,而不需要频繁地修改配置文件中的具体内容。

2. 使用配置文件实现多环境配置

  • 基于application - {env}.properties/yml的配置
    • 在Spring Boot中,我们可以使用application - {env}.properties或者application - {env}.yml的方式来进行多环境配置。例如,我们有一个开发环境的配置文件application - dev.yml和一个生产环境的配置文件application - prod.yml
    • application - dev.yml中,我们可以配置适合开发环境的设置,如:
server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/devdb
    username: devuser
    password: devpassword
  profiles:
    active: dev
logging:
  level:
    root: DEBUG
  • application - prod.yml中,配置适合生产环境的设置:
server:
  port: 80
spring:
  datasource:
    url: jdbc:mysql://prod - db - server:3306/proddb
    username: produser
    password: prodpassword
  profiles:
    active: prod
logging:
  level:
    root: INFO
  • 激活不同环境的方式(如通过命令行参数、系统环境变量)
    • 通过命令行参数:我们可以在启动应用时使用--spring.profiles.active=dev或者--spring.profiles.active=prod这样的命令行参数来激活对应的环境配置。例如,java - jar myapp.jar --spring.profiles.active=dev会激活开发环境的配置。
    • 通过系统环境变量:我们也可以设置系统环境变量SPRING_PROFILES_ACTIVE的值来激活环境。例如,在Linux系统中,我们可以使用export SPRING_PROFILES_ACTIVE=prod来设置环境变量,然后启动应用时就会使用生产环境的配置。

六、总结与展望

在这篇文章中,我们深入探讨了Spring Boot中的配置文件。我们了解了两种主要的配置文件类型application.propertiesapplication.yml,它们各自的语法和特点,以及如何相互转换。我们还学习了如何创建自定义配置属性,通过@ConfigurationProperties注解来实现配置与Java类的绑定。同时,我们明白了配置文件的加载顺序,以及如何利用这个顺序进行灵活的配置覆盖。最后,我们掌握了多环境配置的方法,通过application - {env}.properties/yml的方式和不同的激活环境的手段(命令行参数、系统环境变量),可以让我们的应用在不同的环境中顺利运行。

在下一篇文章中,我们将进入Spring Boot与数据库集成的精彩世界。我们会探讨如何选择适合我们应用的数据库,如何在Spring Boot项目中添加数据库相关的依赖,如何进行数据库连接配置,以及如何使用JPA(Java Persistence API)进行数据持久化等重要内容。这将为我们构建数据驱动的应用奠定坚实的基础。

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

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

相关文章

资质申请中常见的错误有哪些?

在申请建筑资质的过程中,企业可能会犯一些常见的错误,以下是一些需要避免的错误: 1. 资料准备不充分: 申请资质需要提交大量的资料,包括企业法人资料、财务报表、业绩证明等。资料不齐全或不准确都可能导致申请失败。…

多线程(一):线程的基本特点线程安全问题ThreadRunnable

目录 1、线程的引入 2、什么是线程 3、线程的基本特点 4、线程安全问题 5、创建线程 5.1 继承Thread类,重写run 5.1.1 创建Thread类对象 5.1.2 重写run方法 5.1.3 start方法创建线程 5.1.4 抢占式执行 5.2 实现Runnable,重写run【解耦合】★…

MySQL-数据库设计

1.范式 数据库的范式是⼀组规则。在设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数 据库,这些不同的规范要求被称为不同的范式。 关系数据库有六种范式:第⼀范式(1NF)、第⼆范式(…

【Mysql】SQL语言基础

1、SQL的概述 SQL全称:Structured Query Language,是结构化查询语言,用于访问和处理数据库的标准的计算机语言。SQL语言1974年由Boyce和Chamberlin提出,并首先在IBM公司研制的关系数据库系统systemr上实现。 美国国家标准局&#x…

亚信安全发布第34期《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件91起,近三周勒索事件数量较为稳定。从整体上看,Ransomhub是影响最严重的勒索家族;Play和ElDorado恶意家族也是两个活动频繁的恶意家族,需要注意防范。本周,土耳其公司巴克皮…

小红书2024秋招后端开发(Java工程师、C++工程师等)

前几天做了美团,OPPO的秋招笔试题,然后又做了一场小红书,总体难度我觉得都差不多,涉及到的知识点要么是语法模拟,或者就是一些基础算法,所以这样看秋招编程题还是很简单的,对于笔试我们还要把除…

深刻理解Redis集群(下):Redis 哨兵(Sentinel)模式

背景 现在对3个节点的sentinel进行配置。sentinel的配置文件在redis的安装目录中已经存在,只需要复制到指定的位置即可。 sentinel是独立进程,有对应的脚本来执行。 基于之前的redis 一主二从的架构,我们继续启动3个sentinel进程。 哨兵模式的…

使用微服务Spring Cloud集成Kafka实现异步通信

在微服务架构中,使用Spring Cloud集成Apache Kafka来实现异步通信是一种常见且高效的做法。Kafka作为一个分布式流处理平台,能够处理高吞吐量的数据,非常适合用于微服务之间的消息传递。 微服务之间的通信方式包括同步通信和异步通信。 1&a…

GPU参数指标

以英伟达的A800卡为例,简单聊聊GPU卡的核心参数指标,A800的核心指标主要有5个,为算力、显存大小、显存带宽、功耗情况和卡间互联速率。 性能:则可以理解为货车对不同货物类型的马力大小,决定能“拉动”多少重量的货&…

实用工具推荐---- PDF 转换

直接上链接:爱PDF |面向 PDF 爱好者的在线 PDF 工具 (ilovepdf.com) 主要功能如下: 全免费!!!!

什么是 Apache Ingress

Apache Ingress 主要用于管理来自外部的 HTTP 和 HTTPS 流量,并将其路由到合适的 Kubernetes 服务。 容器化与 Kubernetes 是现代云原生应用程序的基础。Kubernetes 的主要职责是管理容器集群,确保它们的高可用性和可扩展性,同时还提供自动化…

httpsok-v1.17.0-SSL通配符证书自动续签

🔥httpsok-v1.17.0-SSL通配符证书自动续签 介绍 httpsok 是一个便捷的 HTTPS 证书自动续签工具,基于全新的设计理念,专为 Nginx 、OpenResty 服务器设计。已服务众多中小企业,稳定、安全、可靠。 一行命令,一分钟轻…

Java中使用接口实现回调函数的详解与示例

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…

【2025】springboot基于微信小程序记账本的设计与实现(源码+文档+调试+答疑)

文章目录 前言一、主要技术?二、项目内容1.整体介绍(示范)2.运行截图3.系统测试 总结更多项目 前言 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,记账本小…

【游戏分组】

题目来源 from itertools import combinations def get_input(): """获取输入的整数列表。""" return list(map(int, input("请输入10个整数(用空格分隔): ").split())) def get_min_difference(arr): &q…

OpenCV C++霍夫圆查找

OpenCV 中的霍夫圆检测基于 霍夫变换 (Hough Transform),它是一种从边缘图像中识别几何形状的算法。霍夫圆检测是专门用于检测图像中的圆形形状的。它通过将图像中的每个像素映射到可能的圆参数空间,来确定哪些像素符合圆形状。 1. 霍夫变换的原理 霍夫…

【韩顺平Java笔记】第3章:变量

只记录我觉得重点的,自用,如果有漏的请自己看视频 文章目录 33. 内容梳理34. 变量原理34.1 为什么需要变量35. 变量概念35.1 概念35.2 变量使用的基本步骤36. 变量入门36.1 变量使用入门案例 37. 变量细节37.1 变量使用注意事项 38. 加号使用38.1 程序中…

身份证号、定位信息等个人信息敏感性判定解析

关于身份证号号码以及精确定位信息是否是敏感个人信息的疑问一直以来不少合规安全从业者有疑惑,本文来自于《数安标准强基助力计划 》作者为指南和标准的起草者,其观点具有一定的权威性,一下为内容摘要,以供大家学习和解惑&#x…

【sourceTree问题】拉取提交的时候需要频繁输入账号密码

用sourceTree进行代码管理的时候会出现一直让输入账号密码的问题,烦不胜烦,可以点击【设置】 → 【编辑配置文件...】打开配置文件: 在配置文件里找到url,把url里面的网址修改为: http://username:passwordxxxxx/xx…

LeetCode 热题 100 回顾7

干货分享,感谢您的阅读!原文见:LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 (简单) 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标…