【Spring Boot系列2】还在为配置文件注解头疼?一文带你全部搞定!

发布时间:2026/9/24 17:31:41

【Spring Boot系列2】还在为配置文件注解头疼?一文带你全部搞定! 讲解SpringBoot的配置文件前我们先学习配置文件读取的相关注解一文带你全部搞定!前言本来想讲解SpringBoot的配置文件但是里面一堆注解让我很是蒙圈感觉用起来都差不多比如PropertySource、ImportResource、Value、ConfigurationProperties等加上之前掌握的Configuration和Bean。一个配置文件搞这么多注解感觉头有点大这篇文章主要是对这些注解进行扫盲希望扫盲完后我以后就不再怕它们了。基于XML方式读取配置为了方便示例讲解我们在包resources下创建一个配置文件jdbc.propertiesjdbc.shop.urljdbc:mysql://localhost:3104/xm_jointly?characterEncodingutf8 jdbc.shop.usernamelouzai jdbc.shop.password123456之前在文章中我们也有这个一个配置但是我们使用XML的方式读取然后还需要在XML中配置文件扫描路径!-- 用于加载配置文件 -- bean classorg.springframework.beans.factory.config.PropertyPlaceholderConfigurer property namelocation valueclasspath:jdbc.properties/value /property /bean然后才能读取里面的配置!-- 定义数据源 -- bean iddataSource classorg.springframework.jdbc.datasource.DriverManagerDataSource property nameurl value${jdbc.shop.url}/property property nameusername value${jdbc.shop.username}/property property namepassword value${jdbc.shop.password}/property /bean那么有没有更优雅的实现方式呢可以继续往下面看。ImportResourceXML中“用于加载配置文件”这块不变直接看示例ImportResource(classpath:applicationContext.xml) public class ImportResourceTest { Value(${jdbc.shop.url}) private String url; Value(${jdbc.shop.username}) private String userName; Value(${jdbc.shop.password}) private String passWord; public static void main(String args[]) { ApplicationContext context new AnnotationConfigApplicationContext(PropertySourceTest.class); PropertySourceTest connection context.getBean(PropertySourceTest.class); System.out.println(connection.toString()); } } // 输出 // PropertySourceTest(urljdbc:mysql://localhost:3104/xm_jointly?characterEncodingutf8, userNamelouzai, passWord123456)通过ImportResource读取配置文件然后通过Value赋值给成员变量Value的用法可以继续往后面看。这种方式感觉还是不太优雅因为还是依赖XML配置有没有完全脱离XML的方式呢PropertySource就登场了。PropertySource ValuePropertySource此注解PropertySource 为Spring 中的 Environment提供方便和声明机制通常与Configuration一起搭配使用直接看示例ComponentScan({com.java.annotation.spring.bean.fileconfig}) Component PropertySource(classpath:jdbc.properties) public class EnvironmentTest { Resource Environment environment; private String url; private String userName; private String passWord; public void getData() { url environment.getProperty(jdbc.shop.url); userName environment.getProperty(jdbc.shop.username); passWord environment.getProperty(jdbc.shop.password); System.out.println(url: url); System.out.println(userName: userName); System.out.println(passWord: passWord); } public static void main(String args[]) { ApplicationContext context new AnnotationConfigApplicationContext(EnvironmentTest.class); EnvironmentTest connection context.getBean(EnvironmentTest.class); connection.getData(); } } // 输出 // url:jdbc:mysql://localhost:3104/xm_jointly?characterEncodingutf8 // userName:louzai // passWord:123456ComponentScan用于扫描EnvironmentTest的beanPropertySource用于引入外部属性配置然后配合Environment可以读取配置的内容这个示例一看就懂So Easy!Value用Environment读取配置感觉好麻烦有没有更简单的方式呢直接看示例ComponentScan({com.java.annotation.spring.bean.fileconfig}) Component PropertySource(classpath:jdbc.properties) ToString public class PropertySourceTest { Value(${jdbc.shop.url}) private String url; Value(${jdbc.shop.username}) private String userName; Value(${jdbc.shop.password}) private String passWord; public static void main(String args[]) { ApplicationContext context new AnnotationConfigApplicationContext(PropertySourceTest.class); PropertySourceTest connection context.getBean(PropertySourceTest.class); System.out.println(connection.toString()); } } // 输出: // DBConnection(urljdbc:mysql://localhost:3104/xm_jointly?characterEncodingutf8, userNamelouzai, passWord123456)直接通过Value进行标注这个也是项目中常用的姿势强烈推荐这种。Value还可以直接为字段赋值获取系统属性这里就不展开了网上资料很多。这种读取配置的方式感觉已经非常优雅了但是每个配置数据都需要通过Value赋值还是有点麻烦有没有更优雅的方式呢ConfigurationProperties登场了。ConfigurationProperties这个是用在SpringBoot中yml配置文件的读取我们先看通过Value逐个读取配置的方式。我们新建一个application.yml配置shop: url: jdbc:mysql://localhost:3104/xm_jointly?characterEncodingutf8 username: louzai password: 123456通过Value方式Service RequestMapping public class HelloWorld { Value(${shop.url}) private String url; Value(${shop.username}) private String userName; Value(${shop.password}) private String passWord; ResponseBody RequestMapping(/hello) public String test() { return url: url , userName: userName , passWord: passWord; } }这个和前面的示例很像只是因为SpringBoot会自动读取application.yml配置所以不用再指定配置文件扫描路径启动SpringBoot程序后输入“http://localhost:8080/hello”输出如下通过ConfigurationProperties方式Service RequestMapping Setter ConfigurationProperties(prefix shop) public class HelloWorld2 { private String url; private String username; private String password; ResponseBody RequestMapping(/hello2) public String test() { return url: url , username: username , password: password; } }启动服务后浏览器输入“http://localhost:8080/hello2”输出如下Configuration Bean这个常用于配置文件管理类用于替换XML中的Bean注入这个必须掌握具体可参考文章《【Spring基础系列3】Spring常用的注解》我们一般会结合上面的配置读取方式然后生成对应的配置类Configuration PropertySource(classpath:es.properties) public class EsConfig { Value(${es.hostname}) private String hostname; Value(${es.port}) private String port; Bean public RestHighLevelClient client() { return new RestHighLevelClient(RestClient.builder(new Node(new HttpHost(hostname, Integer.parseInt(port))))); } }这样我们就可以得到一个配置类EsConfig配置类中的RestHighLevelClient已经通过Bean完成Spring的注入这个也是项目中常用的实现姿势。总结昨天刚陪老婆看了修仙的动画感觉这篇文章就像修仙一样修仙等级炼气→筑基→金丹→元婴→化神→渡劫合道→地仙→天仙→金仙→太乙金仙→大罗金仙→准圣→混元大罗金仙圣人→天道→大道炼气通过XML方式读取配置这个在小米中台的代码中大部分还是这种方式读取配置。筑基通过ImportResource读取XML但是读取数据值的部分移到了对象中即将对象的成员变量用Value赋值。如果还是依赖XML读取数据比如旧的系统代码那这个还是需要使用只是获取数据配置的值可以更优雅一些。金丹干掉XML直接通过PropertySource读取数据配置文件无需XML中转但是配置文件数据用Environment获取。感觉这个已经很少使用了。元婴干掉Environment直接用Value代替这个还是结合PropertySource使用。如果想干掉XML就直接用这个代替吧这个是Spring框架使用配置文件的终极版本。化神已经干掉XML也不用Value一一替换直接通过ConfigurationProperties自动将配置的数据和类的成员变量名关联。这个只基于SpringBoot所以也是我目前遇到的SpringBoot框架使用配置文件的终极版本。渡劫结合Configuration和Bean利用配置类通过自动读取数据配置然后通过这些数据配置项生成对应的对象完全摆脱对XML配置的依赖。这个可以用于Spirng和Spring Boot也是项目中常见的配置类生成姿势。
延伸阅读

更多相关文章

2026/9/24 17:31:41

【Spring Boot系列3】自动化配置详解

主要讲解SpringBoot自动化配置原理,结合系列1的内容,可以形成SpringBoot原理知识体系闭环。SpringBoot只是个框架,前期我主要了解该框架内部的执行原理,然后掌握SpringBoot的基本使用姿势,就达到我的初步目标&#xff…

2026/9/24 17:31:41

【MySql系列1】数值类型长度问题

你知道tinyint(1)、tinyint(11)、int(1)和int(5)的区别么?不懂?那你就要好好看看这篇文章了。前言讨论DB字段的创建时,有个字段只存储整型状态值,因为状态值只能取值0和1,所以我用的是tinyint(1),然后荣哥说…

2026/9/24 17:31:41

【MySql系列2】一文带你搞懂MySql的各种锁

内容包括共享锁S、排它锁X、意向共享锁IS、意向排它锁IX、行锁、间隙锁Gap Lock、Next-Key锁、插入意向锁。以后面试官再问你MySQL的锁,不要只会回答悲观锁和乐观锁了,感觉太Low!!!前言上周五值班时遇到一个很诡异的线…

2026/9/24 18:41:47

运维转网络安全:6-12个月落地转型路线图

写这篇文章之前,我先说个真实的感受。我身边不少做运维的朋友,干了三五年后都会冒出一个念头:“我是不是该转安全?”原因五花八门——有的是觉得运维天花板低,天天处理琐事;有的是看安全岗位薪资高、越老越…

2026/9/24 18:41:47

音频无法播放?加.MP3后缀有用吗?扩展名、容器与解码全解析

“为什么音频不能播放,手动加个.MP3后缀就能播了?”这个问题,我隔三差五就能在群里、论坛上看到有人问。你自己八成也遇到过:朋友发来一段录音,双击打不开,提示“无法播放此文件”或者“文件格式不支持”&a…

2026/9/24 18:41:47

个人微信API二次开发:微信自动回复功能怎么做?

微信客户端里没有一个「打开就自动回所有人」的企业级开关给你的后端用。个人微信API二次开发里的自动回复,本质是三步:消息推到你的服务器 → 你决定回什么 → 再调发送接口。 很多人一上来就上 AI。更稳的顺序是:先关键词固定句跑通&#…

2026/9/24 18:41:47

只需一个console.log:用img-ascii-term在终端显示ASCII字符画

把图片变成 ASCII 字符画,这件事其实我一直觉得挺"反直觉"的——正经人谁会在终端里看图?可偏偏在我动手做这个小工具的时候,才意识到这个需求真实存在,而且比你想象的更日常。前几天我要在一台没有任何图形界面的服务器…

2026/9/24 18:41:47

AI编程工具实战指南:6款主流工具对比与高效开发工作流

说个挺实在的观察:2026年还在靠纯手敲写业务代码的开发者,大概率会被团队里的效率和产出拉开差距。这不是贩卖焦虑,而是过去两年我在好几个项目里亲眼验证过的事——同样一个CRUD模块,用AI工具辅助和不用AI工具,时间能…

2026/9/24 18:36:45

智能家居不是看品牌排行!四个技术指标帮你避开选购坑

很多朋友问我智能家居哪个牌子好,其实这个提问方式本身就把路走窄了。智能家居不是买一台冰箱、一台电视那么简单,它是一套需要在装修前就埋好线的系统级工程。你真正该纠结的,不是Logo上印着谁的名字,而是这套系统本身的协议、生…

2026/9/23 12:07:00

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/24 0:00:21

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:21

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:21

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码