SpringBoot配置文件

SpringBoot配置文件

配置文件的作用

配置文件主要是为了解决硬编码带来的问题,把可能会发生改变的信息,放在一个集中的地方,当我们启动某个程序时,应用程序从配置文件中读取数据,并加载运行。

硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中,也就是我们常说的"代码写死"。

比如手机字体大小

如果采用硬编码的方式,就直接在程序中指定字体大小,所有的用户使用的都是同一个字体大小

但是不同的用户有不同的偏好,我们可以把手机字体的大小放在配置文件中,当程序启动时,读取配置,以用户设置的字体大小来显示。

使用配置文件,可以使程序完成用户和应用程序的交互,或者应用程序与其他应用程序的交互

了解外部化配置

外部化配置:将配置信息存储在应用代码程序之外的地方

比如打了jar包发现Application.prperties不在jar包里,就可以说明Springboot的配置文件是外部化配置

++SpringBoot的应用程序默认先去找外部化配置++

优点:方便了配置的修改,并且修改后不需要重新编译代码,也不需要重新部署项目。

SpringBoot支持多种外部化配置:

  1. properties文件
  2. yml或者yaml文件
  3. 系统环境变量
  4. 命令行参数...

配置文件的格式

Spring Boot配置文件有以下三种:

application. properties

application. yml

application. yaml

yml为yaml的简写,实际开发中出现频率最高. yaml和yml的使用方式一样

配置文件加载优先级

Spring Boot框架在启动时会尝试从以下位置加载 application.

  1. file:./ config/: 首先在Spring Boot当前工作目录下的 config 文件夹中查找 application. properties,如果没有找到,会继续找 application. yml, 如果这两个都没有找到,才会进入以下位置查找,以此类推。
  2. file: ./:如果在当前工作目录下 config 目录中找不到时,再从当前工作目录中查找。
  3. classpath:/config/:如果从工作目录中找不到,会从类路径中找,先从类路径的 /config/ 目录下寻找配置文件。
  4. classpath:/: 如果在 / config/ 下没有找到,它会在类路径的根目录下查找。

如果你想要指定其他的配置文件位置或者改变默认的行为,可以通过打jar包之后运行命令行 java -jar XXX.jar --spring. config. location=后跟路径的方式(绝对路径且注意前面有/)来指定配置文件的具体位置。

application. properties 配置文件是SpringBoot框架默认的配置文件
application. properties 不是必须的, SpringBoot对于应用程序来说,都提供了一套默认配置(就是我们所说的自动配置)

如果你要改变这些默认的行为,可以在 application. properties文件中进行配置。

比如说改端口号,SpringBoot内置了Tomcat服务器,默认端号是8080,可能默认端口别占用,就需要改端口号

application.properties

基本语法

properties是以键值的形式配置的, key和value之间是以"="连接的

举例:

plain 复制代码
# 配置项⽬端⼝号
server.port=8080 
#配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb? characterEncoding=utf8&useSSL=false 
spring.datasource.username=root 
spring.datasource.password=root

@Value注解

@ Value注解可以将 application.properties / application.yml文件中的配置信息注入或者绑定到java对象的属性上。

语法格式:@Value("${key}")

举例:

plain 复制代码
mykey.key1 = bite
plain 复制代码
@RestController
public class PropertiesController {
 @Value("${mykey.key1}")
 private String key1;
 @RequestMapping("/key")
 public String key(){
 return "读取到值:"+key1;
 }
}

输出结果

用@Value注解的时候,如果这个key不存在,并且没有指定默认,则报错

缺点分析

从上述配置key看出,properties配置文件中会有很多的冗余的信息

想要解决这个问题,就可以使用yml配置文件的格式化

application.yml

YML概述

YAML (YAML Ain't Markup Language)是一种人类可读的数据序列化格式,它通常用于配置文件,在各种编程语言中作为一种存储或传输数据的方式。

YAML的设计目标是易于阅读和编写,同时保持足够的表达能力来表示复杂的数据结构。

YAML文件的扩展名可以是. yaml 或 . yml .

常见的数据存储和交换格式

properties 、 XML 、JSON 、 YAML 这几种格式是用来存储和交换数据的常见方式

但它们各有特点和适用场景:

Properties

这种格式主要用于 Java应用程序中的配置文件。它是键值对的形式,每一行是一个键值对,使用等号或冒号分隔键和值

特点是简单易懂,但在处理复杂结构的数据时显得力不从心

XML

XML是一种标记语言,用来描述数据的格式。它支持复杂的数据结构,包括嵌套和属性。

XML文档具有良好的结构化特性,适合传输和存储结构化的数据。但是,XML文档通常体积较大,解析起来也比较耗资源

JSON

JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript的一个子集,支持多种数据类型,如数字、字符串、布尔值、数组和对象。

JSON因为简洁和高效而广泛应用于Web应用程序之间进行数据交换。

YAML

YAML设计的目标之一就是让人类更容易阅读。它支持类似JSON的数据序列化,但提供了更多的灵活性,例如缩进来表示数据结构。

YAML非常适合用来编写配置文件,因为它允许以一种自然的方式组织数据,并且可以包含注释和其他人类可读的元素。

总结来说,这四种格式都可以用来存储和交换数据,但它们的设计初衷和最佳使用场景有所不同。选择哪种格式取决于具体的应用需求、数据复杂度、性能要求等因素。

yml的语法规则

1.YAML支持多种数据类型,包括字符串、数字、布尔值、数组、list集合、map键值对等。 2. YAML使用一个空格来分隔属性名和属性值, 用换行+空格来表示层级关系

例如:

plain 复制代码
server:
  port: 9090
  1. 注意不能使用tab,必须是空格,空格数量无要求,大部分建议2个或4个空格
  2. 同级元素左对齐
    例如
  1. 在一个映射中,键必须是唯一的。

  2. 使用#进行注释。

  3. 大小写敏感

yml配置的读取

yml读取配置的方式properties相同,使用@Value注解

yml配置对象

java 复制代码
student:
 id: 1
 name: Java
 age:15

要使用另⼀个注解@ConfigurationProperties 来读取

java 复制代码
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
 private int id;
 private String name;
 private int age;
}

调用类

java 复制代码
@RestController
public class StudentController {
 @Autowired
 private Student student;
 @RequestMapping("/readStudent")
 public String readStudent(){
 return student.toString();
 }
}
配置集合
java 复制代码
dbtypes:
 name:
  -mysql
  -sqlserver
  -db2
java 复制代码
@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {
 private List<String> name;
}
java 复制代码
@RestController
public class ReadYml2 {
 @Autowired
 private ListConfig listConfig;
 @RequestMapping("/readList")
 public String readList(){
 return listConfig.toString();
 }
}
配置Map
java 复制代码
maptypes:
  map:
    k1: kk1
    k2: kk2
    k3: kk3
java 复制代码
@Component
@ConfigurationProperties("maptypes")
@Data
public class MapConfig {
 private HashMap<String,String> map;
}
java 复制代码
@RestController
public class ReadYml2 {
 @Autowired
 private MapConfig mapConfig;
 @RequestMapping("/readMap")
 public String readStudent(){
 return mapConfig.toString();
 }
}
小细节
  1. 普通文本可以使用单引号或双引号括起来

    单引号括起来:单引号内所有的内容都被当做普通文本,不转义(例如字符串中有\n,则\n被当做普通的字符串

    双引号括起来:双引号中有\n则会被转义为换行符

  2. 保留文本格式

    将文本写到这个符号 | 的下层,会自动保留格式。

  3. 文档切割

    ----这个符号下面的配置可以认为是一个独立的yml文件。便于庞大文件的阅读。

优缺点

优点:

  1. 可读性高,写法简单,易于理解
  2. 支持更多的数据类型,可以简单表达对象,数组,List,Map等数据形态。
  3. 支持更多的编程语言,不止是Java中可以使用,在Golang, Python, Ruby,JavaScript中也可以使用

缺点:

  1. 不适合写复杂的配置文件
  2. 对格式有较强的要求
相关推荐
新停浊酒杯18 分钟前
基于Spring Boot3 Spring Cloud2023 Spring Cloud Alibaba2023对外提供一个分布式微服务最新基础示例模板
spring boot·spring cloud·微服务
小小鸭程序员1 小时前
Spring Boot 整合 Redis 使用教程
java·spring boot·redis·mysql·spring
谷晓光1 小时前
python打印输出到文件
java·linux·python
秋野酱4 小时前
基于javaweb的SpringBoot个人健康管理系统小程序微信小程序设计与实现(源码+文档+部署讲解)
spring boot·微信小程序·小程序·毕业设计
优雅的落幕6 小时前
前端---初识HTML(前端三剑客)
java·前端·javascript·css·html
别惹CC7 小时前
【分布式锁通关指南 08】源码剖析redisson可重入锁之释放及阻塞与非阻塞获取
redis·分布式·后端
百香果果ccc7 小时前
Maven的继承和聚合
java·hive·maven
极客先躯7 小时前
高级java每日一道面试题-2025年3月04日-微服务篇[Eureka篇]-Eureka是什么?
java·微服务·eureka·集群部署·健康检查·组件和架构·自我保护机制
幸好我会魔法7 小时前
RabbitMQ实现定时/延迟任务
java·rabbitmq·java-rabbitmq
是小蟹呀^7 小时前
uni-app+SpringBoot: 前端传参,后端如何接收参数
spring boot·uni-app