【SpringBoot配置文件】

📅 2026/7/22 1:54:38
【SpringBoot配置文件】
本节目标学习SpringBoot配置文件的格式以及对应的语法了解两个配置文件格式的差异1. 配置文件作用配置文件主要用于解决硬编码问题将可能发生变化的信息集中管理程序启动时读取配置加载运行避免把参数直接写死在代码中。SpringBoot 配置文件承载了项目的核心配置信息常见用途包括项目启动端口号数据库连接信息地址、用户名、密码第三方系统调用密钥日志的输出规则与持久化配置典型场景说明端口配置SpringBoot 内置 Tomcat 默认端口为 8080若端口被占用可通过配置文件自定义端口。数据库配置持久层框架需要读取配置中的数据库连接信息适配不同环境的数据库。2. 配置文件快速入手SpringBoot 项目创建时默认生成application.properties配置文件可直接修改配置。示例修改服务启动端口# application.properties server.port9090重启项目后Tomcat 将以 9090 端口启动原 8080 端口失效。3. 配置文件的格式SpringBoot 支持三种配置文件启动时会自动从 classpath 下加载application.propertiesapplication.ymlapplication.yamlyml是yaml的简写二者语法完全一致实际开发中 yml 使用频率最高。格式共存规则理论上 properties 和 yml 可以同时存在于项目中两份配置都会被加载。若两个文件的配置项发生冲突以 properties 为准properties 优先级更高。实际项目建议统一使用同一种配置格式降低维护成本。4. properties 配置文件说明properties 是 SpringBoot 项目默认的配置文件格式属于早期标准配置格式。4.1 基本语法以keyvalue键值对形式配置使用#添加注释。# 配置项目端口号 server.port8080 # 配置数据库连接信息 spring.datasource.urljdbc:mysql://127.0.0.1:3306/testdb?characterEncodingutf8useSSLfalse spring.datasource.usernameroot spring.datasource.passwordroot4.2 读取配置文件使用Value注解配合${key}格式可在代码中读取配置项。配置示例mykey.key1 bite代码读取示例从配置文件中获取值RestControllerRequestMapping(proper)publicclassPropertiesController{Value(${my.key})privateStringmyKey;GetMapping(/getConfigValue)publicStringgetConfigValue(){return从配置中获取值myKeymyKey;}}spring.application.nameSpring-ioc-demo1 server.port9090 my.keyhello worldyml 文件获取方式一致4.3 properties 缺点层级配置会产生大量冗余前缀例如数据库配置需要重复书写spring.datasource前缀配置繁琐且可读性差。5. yml 配置文件说明YAMLYet Another Markup Language是一种树形结构的标记语言yml 是其简写形式。5.1 基本语法基础格式key: value英文冒号后必须加一个空格空格不可省略层级通过换行缩进表示结构清晰数据库配置示例spring:datasource:url:jdbc:mysql://127.0.0.0:3306/dbname?characterEncodingutf8useSSLfalseusername:rootpassword:root相比 properties 格式消除了重复前缀更简洁易读。5.2 yml 使用进阶5.2.1 配置不同数据类型及 null# 字符串string.value:Hello# 布尔值boolean.value:trueboolean.value1:false# 整数int.value:10# 浮点数float.value:3.14159# Null~ 代表 nullnull.value:~# 空字符串empty.value:yml 配置读取基础配置项同样使用Value注解读取用法与 properties 一致。配置示例string:hello:bite代码读取示例RestControllerpublicclassReadYml{Value(${string.hello})privateStringhello;RequestMapping(/ymlKey)publicStringkey(){return读取到值:hello;}}字符串单双引号注意事项字符串默认无需加引号单双引号对特殊字符的处理逻辑不同不加引号特殊字符会被当作普通文本处理单引号会转义特殊字符使其失去特殊含义始终作为普通字符串双引号不会转义特殊字符保留字符本身的含义例如\n会表示换行示例string:str1:Hello \n Spring Boot.str2:Hello \n Spring Boot.str3:Hello \n Spring Boot.str1 和 str2 中\n会作为普通字符输出str3 中\n会作为换行符生效5.2.2 配置对象yml 支持直接配置对象有两种写法分层写法student:id:1name:Javaage:18行内写法效果等价student:{id:1,name:Java,age:18}对象类型无法用Value读取需使用ConfigurationProperties注解配合实体类接收importlombok.Data;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.stereotype.Component;ConfigurationProperties(prefixstudent)ComponentDatapublicclassStudent{privateintid;privateStringname;privateintage;}使用时直接注入对象RestControllerpublicclassStudentController{AutowiredprivateStudentstudent;RequestMapping(/readStudent)publicStringreadStudent(){returnstudent.toString();}}5.2.3 配置集合yml 可配置 List 集合dbtypes:name:-mysql-sqlserver-db2同样使用ConfigurationProperties读取ComponentConfigurationProperties(dbtypes)DatapublicclassListConfig{privateListStringname;}5.2.4 配置 Mapyml 可配置 Map 集合支持两种写法分层写法maptypes:map:k1:kk1k2:kk2k3:kk3行内写法效果等价maptypes:{map:{k1:kk1,k2:kk2,k3:kk3}}使用ConfigurationProperties读取ComponentConfigurationProperties(maptypes)DatapublicclassMapConfig{privateHashMapString,Stringmap;}5.3 yml 优缺点优点可读性高写法简洁层级结构清晰易理解支持丰富的数据类型可便捷表达对象、数组、List、Map 等结构跨语言通用不仅 JavaGolang、Python、JavaScript 等语言均可使用缺点过于复杂的配置用 yml 表达后可读性反而下降编写和转换成本高格式要求极其严格空格缩进错误会直接导致配置失效6. 综合性练习验证码案例使用 Hutool 工具库实现图形验证码功能包含生成验证码、校验验证码两个核心能力。6.1 需求说明页面展示图形验证码用户输入验证码后提交后端校验是否正确校验成功则跳转页面6.2 前后端交互接口接口1生成验证码请求URL/captcha/getCaptcha响应验证码图片流浏览器直接展示图片接口2校验验证码请求URL/captcha/check请求参数captcha用户输入的验证码字符串响应布尔值true表示验证成功false表示验证失败6.3 Hutool 工具介绍Hutool 是一款 Java 工具类库封装了文件、加密、正则、验证码等常用能力通过静态方法降低 API 使用成本。官网https://hutool.cn/6.4 服务端实现步骤1引入依赖dependencygroupIdcn.hutool/groupIdartifactIdhutool-captcha/artifactIdversion5.8.43/version/dependency步骤2配置项抽离将验证码参数写入 yml 配置文件captcha:width:100height:40session:key:CAPTCHA_SESSION_KEYdate:KAPTCHA_SESSION_DATE创建配置属性类接收配置DataComponentConfigurationProperties(prefixcaptcha)publicclassCaptchaProperties{privateIntegerwidth;privateIntegerheight;privateSessionsession;DatapublicstaticclassSession{privateStringkey;privateStringdate;}}步骤3生成验证码接口RequestMapping(/captcha)RestControllerpublicclassHuToolCaptchaController{AutowiredprivateCaptchaPropertiescaptchaProperties;RequestMapping(/getCaptcha)publicvoidgetCode(HttpSessionsession,HttpServletResponseresponse){// 生成指定尺寸的线条验证码LineCaptchalineCaptchaCaptchaUtil.createLineCaptcha(captchaProperties.getWidth(),captchaProperties.getHeight());response.setContentType(image/jpeg);response.setHeader(Pragma,No-cache);try{// 输出图片到响应流lineCaptcha.write(response.getOutputStream());// 将验证码和生成时间存入 Sessionsession.setAttribute(captchaProperties.getSession().getKey(),lineCaptcha.getCode());session.setAttribute(captchaProperties.getSession().getDate(),newDate());response.getOutputStream().close();}catch(IOExceptione){e.printStackTrace();}}}步骤4校验验证码接口// 验证码有效期1分钟privatefinalstaticlongVALID_MILLIS_TIME60*1000;RequestMapping(/check)publicbooleancheckHomeCaptcha(Stringcaptcha,HttpSessionsession){// 空参数直接返回失败if(!StringUtils.hasLength(captcha)){returnfalse;}// 从 Session 取出保存的验证码和生成时间StringsavedCaptcha(String)session.getAttribute(captchaProperties.getSession().getKey());DatesessionDate(Date)session.getAttribute(captchaProperties.getSession().getDate());// 忽略大小写比对且校验有效期if(captcha.equalsIgnoreCase(savedCaptcha)){if(sessionDatenull||System.currentTimeMillis()-sessionDate.getTime()VALID_MILLIS_TIME){returntrue;}}returnfalse;}关系图验证码示例captcha:width:200height:100session:code:captchaCodedate:captchaDate引用关系见图主要有ConfigurationProperties(prefix captcha)才能获取到值6.5 前端页面调整通过 Ajax 提交验证码进行校验成功则跳转页面$(#checkCaptcha).click(function(){$.ajax({url:/captcha/check,type:post,data:{captcha:$(#inputCaptcha).val()},success:function(result){if(result){location.hrefsuccess.html;}else{alert(验证码错误);$(#inputCaptcha).val();}}});});7. 总结properties 采用keyvalue的键值对格式yml 采用树形缩进的层级格式。读取单个配置项使用Value注解格式为${配置key}。yml 层级通过换行缩进区分key: value中冒号后的空格不可省略。properties 是默认配置格式存在冗余前缀问题yml 更简洁支持复杂数据类型但不适合超复杂配置。properties 与 yml 可共存但优先级以 properties 为准项目中建议统一使用一种格式。properties和yml配置冲突时以properties为准