news 2026/5/26 11:03:09

优雅使用Enum提升SpringBoot配置管理效率

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
优雅使用Enum提升SpringBoot配置管理效率

👉这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:

  • 《项目实战(视频)》:从书中学,往事上“练”

  • 《互联网高频面试题》:面朝简历学习,春暖花开

  • 《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题

  • 《精进 Java 学习指南》:系统学习,互联网主流技术栈

  • 《必读 Java 源码专栏》:知其然,知其所以然

👉这是一个或许对你有用的开源项目

国产Star破10w的开源项目,前端包括管理后台、微信小程序,后端支持单体、微服务架构

RBAC权限、数据权限、SaaS多租户、商城、支付、工作流、大屏报表、ERP、CRMAI大模型、IoT物联网等功能:

  • 多模块:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • 微服务:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK17/21+SpringBoot3、JDK8/11+Spring Boot2双版本

来源:juejin.cn/post/7459363593475326002

  • 业务背景

  • 配置管理的重要性

  • 枚举类的应用

  • 具体示例

    • 项目依赖 (pom.xml)

    • 配置文件 (application.yml)

    • 定义枚举类 (UserTypeEnum.java)

    • 配置类 (AppConfig.java)

    • 控制器 (UserController.java)

    • Thymeleaf 前端页面 (user-types.html)


业务背景

在软件开发中,配置管理是确保应用程序能够在不同环境中灵活运行的关键环节。对于 Spring Boot 项目,配置文件(如application.ymlapplication.properties)通常用于存储各种配置项,如数据库连接信息、服务端口、API密钥等。然而,随着业务逻辑的复杂化,直接使用字符串或数字作为配置项可能会导致代码的可读性和可维护性下降。

枚举类(Enum) 提供了一种将一组固定的值封装在一起的方法,这不仅提高了代码的可读性,还能避免硬编码(magic number)带来的潜在问题。通过将业务中的固定状态、类型等内容定义为枚举,可以使得代码更加严谨和可维护。例如,用户角色、订单状态、支付方式等都可以通过枚举来管理。

在实际业务中,可能需要根据不同的环境或配置动态调整这些枚举值。@ConfigurationProperties注解允许开发者将外部配置文件中的内容映射到 Java 类中,从而实现配置的动态管理。结合枚举类和@ConfigurationProperties,可以实现一种高效、灵活且易于维护的配置管理方式。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

配置管理的重要性

在 Spring Boot 项目中,配置管理通常通过application.ymlapplication.properties文件来实现。这些文件可以存储不同环境的配置信息,如数据库连接、服务器端口等。然而,随着业务逻辑的复杂化,直接使用字符串或数字作为配置项会带来以下问题:

  • 可读性差:代码中直接使用字符串或数字,难以理解其含义。

  • 维护成本高:修改配置时需要在多处查找和替换,容易出错。

  • 硬编码问题:直接使用字符串或数字容易导致潜在的错误。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

枚举类的应用

Enum 在 Java 中是一种特殊的数据类型,它允许开发者定义一组常量。

在实际业务中,Enum 通常用于表示业务中的固定状态、类型等内容,如用户角色、订单状态、支付方式等。

通过将这些常量定义在枚举中,不仅可以提高代码的可读性,还能避免硬编码(magic number)带来的潜在问题。

结合@ConfigurationProperties注解,开发者可以将外部配置文件中的内容映射到 Java 类中。

这使得配置管理更加灵活、易于维护,特别是对于较为复杂的配置结构,如枚举值的配置管理。

具体示例

文章通过一个具体的示例展示了如何在 Spring Boot 项目中结合 Enum 和@ConfigurationProperties实现配置化管理。示例包括以下几个部分:

  • 项目依赖:使用 Maven 的pom.xml文件定义项目依赖,包括Spring Boot Starter WebThymeleaf模板引擎和 Lombok。

  • 配置文件:在 application.yml 文件中定义用户类型的配置。

  • 枚举类:定义一个UserTypeEnum枚举类,包含三种用户类型及其描述。

  • 配置类:使用@ConfigurationProperties注解将配置文件中的内容映射到 Java 类中。

  • 控制器:创建一个控制器类UserController,用于处理/user-types请求,并将用户类型的描述传递到前端。

  • 前端页面:使用 Thymeleaf 模板引擎渲染从后端传递过来的数据,展示用户类型的描述。

项目依赖 (pom.xml)

<dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Thymeleaf 模板引擎 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- Lombok 用于简化 Java 代码 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <!-- Spring Boot Starter Validation 用于参数校验 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <!-- Spring Boot DevTools 用于开发时的热部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> </dependencies>

配置文件 (application.yml)

spring: datasource: url:jdbc:mysql://localhost:3306/your_database username:your_username password:your_password server: port:8080 app: user-type: admin:ADMIN user:USER guest:GUEST

定义枚举类 (UserTypeEnum.java)

public enum UserTypeEnum { ADMIN("管理员"), USER("普通用户"), GUEST("游客"), VIP("VIP用户"), MODERATOR("版主"); privatefinal String description; UserTypeEnum(String description) { this.description = description; } public String getDescription() { return description; } }
详细说明
  • UserTypeEnum是一个枚举类,定义了三种用户类型:管理员(ADMIN)、普通用户(USER)和游客(GUEST)。

  • 每种用户类型都有一个描述(description),用于提供对应的中文描述。

  • 枚举常量声明:

    • ADMIN 对应 "管理员"。

    • USER 对应 "普通用户"。

    • GUEST 对应 "游客"。

  • 构造函数UserTypeEnum(String description)用于初始化枚举常量的描述。

  • getDescription方法返回对应的描述。

配置类 (AppConfig.java)

使用@ConfigurationProperties注解将配置文件中的内容映射到 Java 类中,并使用 Enum 来表示这些配置项。

import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import com.icoderoad.enumconfig.enums.UserTypeEnum; import lombok.Data; @Data @Component @ConfigurationProperties(prefix = "app") publicclass AppConfig { private UserType userType; private Database database; private Server server; @Data publicstaticclass UserType { private UserTypeEnum admin; private UserTypeEnum user; private UserTypeEnum guest; private UserTypeEnum vip; private UserTypeEnum moderator; } @Data publicstaticclass Database { private String url; private String username; private String password; } @Data publicstaticclass Server { privateint port; } }
详细说明
  • AppConfig类是一个 Spring 配置类,用于加载和存储应用程序配置。

  • @Data注解来自 Lombok,自动生成gettersettertoStringequalshashCode方法。

  • @Component注解将类标记为 Spring 组件,以便在 Spring 容器中进行管理。

  • @ConfigurationProperties(prefix = "app")注解将类标记为配置属性类,并指定配置前缀为 "app"。

  • AppConfig类包含一个嵌套的静态类UserType,用于定义用户类型的配置:

    • admin 对应管理员用户类型。

    • user 对应普通用户类型。

    • guest 对应游客用户类型。

控制器 (UserController.java)

创建一个控制器来展示如何使用从配置中读取到的枚举值。

import com.example.demo.config.AppConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller publicclass UserController { @Autowired private AppConfig appConfig; @GetMapping("/user-types") public String getUserTypes(Model model) { model.addAttribute("adminType", appConfig.getUserType().getAdmin().getDescription()); model.addAttribute("userType", appConfig.getUserType().getUser().getDescription()); model.addAttribute("guestType", appConfig.getUserType().getGuest().getDescription()); model.addAttribute("vipType", appConfig.getUserType().getVip().getDescription()); model.addAttribute("moderatorType", appConfig.getUserType().getModerator().getDescription()); return"index"; } }
详细说明
  • UserEnumController是一个 Spring MVC 控制器类,用于处理/user-types请求。

  • @Controller注解将类标记为 Spring MVC 控制器。

  • appConfig属性通过@Autowired注解进行自动注入,引用AppConfig配置类的实例。

  • getUserTypes方法处理 GET 请求/user-types

    appConfig获取用户类型的描述,将描述添加到 Model 对象中:

    • "adminType" 对应管理员用户类型的描述。

    • "userType" 对应普通用户类型的描述。

    • "guestType" 对应游客用户类型的描述。

  • 返回视图名称 "index",用于展示用户类型的描述。

Thymeleaf 前端页面 (user-types.html)

通过Thymeleaf模板引擎渲染从后端传递过来的数据。

src/main/resources/templates目录下创建index.html文件

<!DOCTYPE html> <html lang="zh-CN" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>用户类型</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css"> </head> <body> <div class="container"> <h1 class="mt-5">用户类型</h1> <table class="table table-bordered mt-3"> <thead> <tr> <th>角色</th> <th>描述</th> </tr> </thead> <tbody> <tr> <td>ADMIN</td> <td th:text="${adminType}"></td> </tr> <tr> <td>USER</td> <td th:text="${userType}"></td> </tr> <tr> <td>GUEST</td> <td th:text="${guestType}"></td> </tr> <tr> <td>VIP</td> <td th:text="${vipType}"></td> </tr> <tr> <td>MODERATOR</td> <td th:text="${moderatorType}"></td> </tr> </tbody> </table> </div> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script> </body> </html>

欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。 谢谢支持哟 (*^__^*)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 11:01:44

告别Arduino IDE:在VSCode中搭建ESP8266高效开发环境

1. 为什么选择VSCode开发ESP8266&#xff1f; 如果你还在用Arduino IDE开发ESP8266项目&#xff0c;可能会遇到这些烦恼&#xff1a;代码补全基本靠猜、跳转定义完全不存在、调试信息像在玩解谜游戏。我刚开始用Arduino IDE时&#xff0c;最崩溃的是每次要找函数定义都得手动翻…

作者头像 李华
网站建设 2026/5/26 11:00:06

抖音评论采集神器:3分钟搞定千条评论数据分析

抖音评论采集神器&#xff1a;3分钟搞定千条评论数据分析 【免费下载链接】TikTokCommentScraper 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokCommentScraper 还在为手动复制抖音评论而头疼吗&#xff1f;想要快速获取热门视频的用户反馈却不知从何下手&#…

作者头像 李华
网站建设 2026/5/26 11:00:04

PowerCLI连接vCenter报错无法连接?一招彻底解决

在VMware虚拟化自动化运维中&#xff0c;使用PowerCLI连接vCenter服务器时&#xff0c;经常弹出“Could not connect to server”连接失败报错&#xff0c;即便vCenter网页能正常登录&#xff0c;命令行依旧无法建立连接。该故障主要由网络端口不通、地址填写错误和SSL证书校验…

作者头像 李华
网站建设 2026/5/26 10:57:43

工厂落地俄罗斯诚实标识二维码的技术路径与方案选型

引言 俄罗斯诚实标识系统&#xff08;Честный ЗНАК&#xff09;已进入全面强制阶段&#xff0c;核心采用 DataMatrix 二维码作为唯一追溯载体&#xff0c;要求出口企业实现单品至托盘的全链路数据关联与合规上报。对俄出口工厂需解决高速解码、多级关联、异常拦截、…

作者头像 李华
网站建设 2026/5/26 10:56:59

3分钟免费解锁Office完整功能:Ohook终极激活指南

3分钟免费解锁Office完整功能&#xff1a;Ohook终极激活指南 【免费下载链接】ohook An universal Office "activation" hook with main focus of enabling full functionality of subscription editions 项目地址: https://gitcode.com/gh_mirrors/oh/ohook …

作者头像 李华