当前位置: 首页 > news >正文

【Spring Boot 快速入门】六、配置文件

目录

  • 配置文件
    • 参数配置化
    • yml 配置文件
    • @ConfigurationProperties

配置文件

参数配置化

在文件上传部分中,UserServiceImpl 中写死了上传目录路径:

String uploadDir = "IDEA-workspace/demo3/images/";

这个写法 不灵活、不安全、可维护性差。比如:

  • 如果换一台服务器,这个路径可能不存在;
  • 如果部署到 Linux 环境,路径规则会变;
  • 如果有多个环境(开发、测试、生产),每个环境的路径不同;
  • 如果要改动上传路径,还要改代码、重新打包部署。

因此,更推荐的做法是:将这种“易变的信息”写到配置文件中,由代码读取它。

首先要在 application.properties 中配置上传路径:

# 上传文件保存的绝对路径(根据你机器上的真实目录填写)
file.upload.dir=/Users/yourname/project/demo3/images/# 静态资源访问路径(浏览器访问时的前缀)
file.access.prefix=/images/

然后使用 Spring Boot 提供的 @Value 注解将配置文件中的值注入到变量中:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl implements UserService {@Value("${file.upload.dir}")private String uploadDir;@Value("${file.access.prefix}")private String accessPrefix;// ...
}

最后在上传逻辑中使用这些变量即可:

// 确保目录存在
File dir = new File(uploadDir);
if (!dir.exists()) {dir.mkdirs();
}// 保存文件
String path = UUID.randomUUID().toString() + ext;
image.transferTo(new File(uploadDir + path));// 访问路径用于存入数据库(浏览器访问时的路径)
String accessPath = accessPrefix + path;User user = new User(null, username, name, gender, accessPath, LocalDateTime.now(), LocalDateTime.now());
userMapper.adduser(user);

yml 配置文件

基本语法:

  • 大小写敏感
  • 数值前必须有空格作为分隔符
  • 使用缩进表示层级关系,缩进时不允许使用 Tab 键,只能用空格(IDEA 中会自动将 Tab 转换为空格)
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • # 表示注解,从这个字符一直到行尾都会被解析器忽略

yml 配置文件是层级格式:

server:port: 8080address: 127.0.0.1

yml 数据格式:

  • 对象/Map 集合:
    user:name: zhangsanage: 18password: 123456
    
  • 数组/List/Set 集合:
    hobby:- java- game- sport
    

.yml vs .properties 区别:

特点.properties.yml
格式key=value层级缩进式结构
可读性较弱强(适合结构复杂的配置)
层级结构使用 . 拼接使用缩进

将上面的 application.properties 文件改为 application.yml 文件:

file:upload:dir: /Users/yourname/project/demo3/images/access:prefix: /images/

也可以像 application.properties 文件那样使用 @Value 注解将配置文件中的值注入到变量中

@ConfigurationProperties

每个配置参数对应的变量名都要使用 @Value 来注入值:

@Service
public class UserServiceImpl implements UserService {@Value("${file.upload.dir}")private String uploadDir;@Value("${file.access.prefix}")private String accessPrefix;// ...
}

如果配置的参数很多,就要写很多个 @Value 来进行注入,这样就显得代码很臃肿。

为了解决这个问题,可以通过创建一个配置类来定义变量,然后使用 @ConfigurationProperties 来注入值。

具体步骤如下:

  1. 创建配置类 FileProperties,并交由 IOC 容器管理:
    @Data
    @Component
    @ConfigurationProperties(prefix = "file"){private Upload upload;private Access access;@Datapublic static class Upload {private String dir;}@Datapublic static class Access {private String prefix;}
    }
    
    注:如果两个配置参数的前缀一致,比如说:
    file:upload:dir: /Users/yourname/project/demo3/images/prefix: /images/
    
    配置类就为:
    @Data
    @Component
    @ConfigurationProperties(prefix = "file.upload")
    public class FileUploadProperties {private String upload;private String access;
    }
    
  2. 使用配置类:
    import org.springframework.beans.factory.annotation.Autowired;@Service
    public class UserServiceImpl implements UserService {@Autowiredprivate FileUploadProperties fileProps;public void adduser(...) {String uploadDir = fileProps.getUpload().getDir();String accessPrefix = fileProps.getAccess().getPrefix();// ...}
    }
    
  3. 配置依赖(可选):
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId>
    </dependency>
    

@ConfigurationProperties 与 @Value:

  • 相同点:都是用来注入外部配置属性的
  • 不同点:
    • @Value 注解只能一个一个的进行外部属性的注入
    • @ConfigurationProperties 可以批量的将外部的属性配置注入到 Bean 对象的属性中
http://www.lryc.cn/news/610013.html

相关文章:

  • Java 发送 HTTP POST请求教程
  • Scikit-learn - 机器学习库初步了解
  • MoonBit Pearls Vol.04:用MoonBit 探索协同式编程
  • Spring IoC容器与Bean管理
  • GPTs——定制的小型智能体
  • 白杨SEO:百度搜索开放平台发布AI计划是什么?MCP网站红利来了?顺带说说其它
  • [Oracle] || 连接运算符
  • 关于如何自定义vscode(wsl连接linux)终端路径文件夹文件名字颜色的步骤:
  • 【PHP】获取图片的主要颜色值RGB值
  • 【Django】-3- 处理HTTP响应
  • Django 性能优化详解:从数据库到缓存,打造高效 Web 应用
  • CNN卷积神经网络之MobileNet和ResNet(五)
  • AWS Lambda Function 全解:无服务器计算
  • CAD格式转换器HOOPS Exchange:全方位支持HOOPS系列产品
  • Webpack 搭建 Vue3 脚手架详细步骤
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现人脸面部表情的追踪识别(C#代码UI界面版)
  • [3D数据存储] Archive (File Container) | 创建/写入/读取 | 存储格式HDF5
  • pyqt5-tools/pyqt6-tools 安装失败,解决办法
  • app-1
  • Spring P1 | 创建你的第一个Spring MVC项目(IDEA图文详解版,社区版专业版都有~)
  • 理解 Agent 的基本概念与功能
  • 正点原子STM32MP257开发板移植ubuntu24.04根文件系统(带桌面版)
  • RTSP/RTMP播放器超低延迟实战:无人机远控视觉链路的工程实践
  • [特殊字符]️ 整个键盘控制无人机系统框架
  • 链表与数组面试常见问题详解与实现
  • 分布式存储性能跃迁指南:RoCE无损网络设计与优化
  • mysql远程登陆失败
  • DC-Mamba:一种用于热红外无人机图像盲超分辨率的退化感知跨模态框架
  • 正则表达式在js中的应用
  • Hadoop MapReduce 3.3.4 讲解~