【Java 开发日记】有了解过 SpringBoot 的参数配置吗?

【Java 开发日记】有了解过 SpringBoot 的参数配置吗?

目录

核心概念:application.properties 与 application.yml

配置的加载位置与优先级

外部化配置(非常强大)

如何在代码中获取配置值?

常用配置示例

总结


当然了解,Spring Boot 的参数配置是其核心特性之一,也是它实现“约定大于配置”理念的关键。它极大地简化了传统 Spring 应用中繁琐的 XML 配置。

一、核心概念:application.propertiesapplication.yml

Spring Boot 默认使用这两种文件进行配置(二者选其一即可,.yml 更常用)。

application.properties (传统键值对格式)

server.port=8081 spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=secret logging.level.com.example.demo=debug

application.yml (YAML 格式,层次感更强,推荐使用)

server: port: 8081 spring: datasource: url: jdbc:mysql://localhost:3306/mydb username: root password: secret logging: level: com.example.demo: debug

YAML 注意事项:缩进必须使用空格,不能使用 Tab 键,冒号后面必须有一个空格。

二、配置的加载位置与优先级

Spring Boot 会从以下位置按从高到低的优先级加载 application 配置文件(高优先级的配置会覆盖低优先级的配置):

  1. 当前项目根目录下的/config子目录
  2. 当前项目根目录
  3. classpath 下的/config (即 src/main/resources/config)
  4. classpath 根路径 (即 src/main/resources)

最佳实践:在开发时,将通用配置放在 src/main/resources/application.yml 中。在打包部署时,可以在 JAR 包所在目录创建一个 config 文件夹,里面放一个 application.yml 来覆盖开发环境的配置(如数据库连接),这样就实现了配置与代码分离

三、外部化配置(非常强大)

除了配置文件,Spring Boot 还支持多种外部配置方式,优先级高于application.yml。这在容器化部署(如 Docker)时尤其有用。

  1. 命令行参数
java -jar yourapp.jar --server.port=8888 --spring.datasource.url=jdbc:mysql://prod-server:3306/proddb
  1. 操作系统环境变量
    Spring Boot 会自动识别形如 SPRING_DATASOURCE_URL 的环境变量(注意大小写和下划线)。
  2. Profile-specific 配置(多环境配置)这是管理不同环境(开发、测试、生产)配置的最佳方式。在通用的 application.yml 中,通过 spring.profiles.active 属性来激活特定环境的配置。
    • 配置文件命名规则:application-{profile}.yml
    • 例如:
      • application-dev.yml (开发环境)
      • application-test.yml (测试环境)
      • application-prod.yml (生产环境)

application.yml

spring: profiles: active: dev # 默认激活开发环境

激活方式

  • 在配置文件中设置(如上所示)。
  • 命令行激活:java -jar yourapp.jar --spring.profiles.active=prod
  • JVM 参数:-Dspring.profiles.active=test
  • 环境变量:export SPRING_PROFILES_ACTIVE=prod

四、如何在代码中获取配置值?

@Value 注解 (适用于单个属性)

@Component public class MyComponent { @Value("${server.port}") private int serverPort; @Value("${app.message: Hello Default}") // 使用冒号指定默认值 private String message; // ... }

@ConfigurationProperties注解 (推荐,用于绑定一组配置)

这是更类型安全、更面向对象的方式。

步骤 1:在 application.yml 中定义配置

app: user: name: "Alice" age: 30 email: "[email protected]" hobbies: - reading - hiking

步骤 2:创建一个配置类来绑定这些属性

@Component @ConfigurationProperties(prefix = "app.user") // 前缀是 app.user @Data // Lombok 注解,自动生成 getter/setter // 或者也可以手动写 getter 和 setter public class UserProperties { private String name; private Integer age; private String email; private List<String> hobbies; }

步骤 3:在需要的地方注入并使用

@Service public class MyService { @Autowired private UserProperties userProperties; public void doSomething() { System.out.println("User name: " + userProperties.getName()); System.out.println("User hobbies: " + userProperties.getHobbies()); } }

别忘了在启动类上添加 @EnableConfigurationProperties 注解(但如果你像上面一样在配置类上使用了 @Component,则不需要)。

五、常用配置示例

# 服务器配置 server: port: 8080 servlet: context-path: /api # 应用上下文路径 # 数据源配置 spring: datasource: url: jdbc:mysql://localhost:3306/test username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver # JPA 配置 jpa: hibernate: ddl-auto: update # 生产环境不要用 create-drop 或 update show-sql: true # 日志配置 logging: level: root: info org.springframework.web: debug com.example: trace file: name: logs/myapp.log # 输出到文件 # 自定义配置 myapp: feature: enabled: true api-url: https://api.example.com

总结

Spring Boot 的参数配置系统非常灵活和强大,其核心思想是:

  • 约定大于配置:提供了大量默认配置,开箱即用。
  • 配置外部化:允许你通过文件、命令行、环境变量等多种方式覆盖默认配置,轻松适应不同环境。
  • 类型安全绑定:通过 @ConfigurationProperties 可以轻松地将一组配置映射到 Java Bean 上,是管理自定义配置的首选方式。

如果小假的内容对你有帮助,请点赞评论收藏。创作不易,大家的支持就是我坚持下去的动力!

Read more

【C++初阶】:C++入门相关知识(3):引用 & inline内联函数 & nullptr相关概念

【C++初阶】:C++入门相关知识(3):引用 & inline内联函数 & nullptr相关概念

🎈主页传送门:良木生香 🔥个人专栏:《C语言》 《数据结构-初阶》 《程序设计》《鼠鼠的C++学习之路》 🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离 前言:在上一篇文章中,我们学习了C++的输入输出,缺省参数以及函数重载,这些都是C++入门必备的基础知识,那么在这篇文章中,我们就要来学习剩下C++其他的基础知识,那就是引用、inline、以及nullptr这些知识。 一、引用 1.1、引用的概念和定义 引用不是定义一个新变量,而是给已经存在的变量起一个别名,那么编译器就不会为别名重新开辟空间,它和引用变量共同使用同一块空间。就好比我们把土豆称为马铃薯,番茄称为西红柿一样,都是取了一个新的别名,但是东西是同一个东西,所以引用的语法如下: 类型& 别名 = 变量 使用方法如下: int a = 10; int&

By Ne0inhk
华为OD技术面八股文_C++_01

华为OD技术面八股文_C++_01

文章目录 * C语言和C++的区别 * C++11引入哪些新特性 * 什么是面向对象?面向对象的三大特性 * malloc和new的区别 * delete和free的区别 * delete和delete[]的区别 * 什么是虚函数?什么是纯虚函数 * 什么是虚函数表?什么是虚函数指针? * 介绍一下虚函数实现机制 * 构造函数和构析函数能不能写为虚函数,为什么 * 说一下构造、析构函数的调用顺序 C语言和C++的区别 1. C++有新增的关键字和语法,还允许自定义命名空间。 2. C++新增类的概念,C语言中只有struct的概念。C++中添加访问权限概念,struct 的默认访问权限和继承权限都是 public,但是 class 的默认访问权限和默认继承权限都是 private. 3. C++引入了类、封装、继承、多态、模板、重载、异常处理机制等特性。而C没有 4.

By Ne0inhk
同名成员到底调用谁?C++ 隐藏规则你真的会吗?

同名成员到底调用谁?C++ 隐藏规则你真的会吗?

欢迎来到 s a y − f a l l 的文章 欢迎来到say-fall的文章 欢迎来到say−fall的文章 🌈say-fall:个人主页🚀专栏:《手把手教你学会C++》 | 《C语言从零开始到精通》 | 《数据结构与算法》 | 《小游戏与项目》💪格言:做好你自己,才能吸引更多人,与他们共赢,这才是最好的成长方式。 前言: 对于c++来说,有三大核心特性,是面向对象编程(OOP)的经典三要素:封装、继承、多态。这三个特性是 C++ 区别于纯面向过程语言(如 C)的核心,也是理解 C++ 面向对象思想的关键。之前利用类和对象的思想和STL中的适配器:queue和stack了解过封装,本篇文章就详细介绍一下继承这个特性 文章目录 * 前言: * 正文: * 一、

By Ne0inhk
【C++笔记】STL详解:string的实现

【C++笔记】STL详解:string的实现

前言:                 在前面的学习中,我们已经初步掌握了string类接口函数的使用方法,本文将带领大家从零开始,逐步实现一个完整的string类。          一、string类总览                 温馨提示: 为了避免与标准库中的string产生命名冲突,我们使用mystd命名空间进行封装。 namespace mystd { class string { public: //迭代器 typedef char* iterator; typedef const char* const_iterator; //默认成员函数 string(); string(const char* str); //构造函数 string(const string& s); //拷贝构造函数 string& operator=(const string& s); //赋值运算符重载函数 ~string(); //析构函数 //迭代器相关函数 iterator begin(

By Ne0inhk