Spring从零开始学使用系列(三)--Spring框架中@Value注解和配置管理详解

  如果各位老爷觉得可以,请点赞收藏评论,谢谢啦!!

  文章中涉及到的图片均由AI生成

  公众号在最下方!!!

目录

1. 如何在Spring中使用@Value注解

1.1 基本用法

1.2提供默认值

2. 如何配置和使用PropertySourcesPlaceholderConfigurer

2.1 基本配置

2.2 处理未解析的占位符

2.3 自定义占位符前缀和后缀

3. Spring中的内置类型转换功能如何使用

3.1 基本类型转换

3.2 自定义类型转换

3.3 集成Spring表达式语言(SpEL)

4. 总结


1. 如何在Spring中使用@Value注解

        @Value注解是Spring框架中用于注入外部化属性值的一种方式。它通常与Spring的配置文件(如application.properties或application.yml)一起使用,能够将配置文件中的值注入到Spring Bean中,提供灵活的配置管理。以下是详细的使用方法和示例。

1.1 基本用法

        首先,我们来看一个简单的示例,展示如何将配置文件中的属性值注入到一个Spring Bean中。假设我们有一个MovieRecommender类,需要从配置文件中获取catalog的值:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class MovieRecommender {private final String catalog;public MovieRecommender(@Value("${catalog.name}") String catalog) {this.catalog = catalog;}public String getCatalog() {return catalog;}
}

        在这个示例中,我们使用@Value("${catalog.name}")注解将catalog.name的值注入到catalog字段中。为了使这个注入生效,我们需要在配置文件中定义catalog.name的值。例如,在application.properties文件中:

catalog.name=MovieCatalog

1.2提供默认值

        在某些情况下,属性值可能没有定义。我们可以在@Value注解中提供一个默认值,以确保应用程序在缺少配置时仍能正常使用:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class MovieRecommender {private final String catalog;public MovieRecommender(@Value("${catalog.name:defaultCatalog}") String catalog) {this.catalog = catalog;}public String getCatalog() {return catalog;}
}

2. 如何配置和使用PropertySourcesPlaceholderConfigurer

        在Spring应用程序中,PropertySourcesPlaceholderConfigurer是一个非常有用的工具,它允许我们使用占位符来引用外部化的配置值。通过使用PropertySourcesPlaceholderConfigurer,我们可以确保在Spring应用程序启动时,所有的占位符都能被正确解析和替换。

2.1 基本配置

        要使用PropertySourcesPlaceholderConfigurer,我们首先需要在配置类中定义一个PropertySourcesPlaceholderConfigurer bean:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;@Configuration
public class AppConfig {@Beanpublic static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {return new PropertySourcesPlaceholderConfigurer();}
}

        使用上述配置,Spring将在初始化时加载并解析所有的占位符。如果任何占位符无法解析,将导致Spring初始化失败。我们还可以通过自定义方法如setPlaceholderPrefix、setPlaceholderSuffix或setValueSeparator来调整占位符的行为。

2.2 处理未解析的占位符

        默认情况下,PropertySourcesPlaceholderConfigurer将尝试解析占位符,并在无法解析时使用占位符名称作为默认值。为了严格控制未解析的占位符,可以配置PropertySourcesPlaceholderConfigurer使其在遇到未解析的占位符时抛出异常:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;@Configuration
public class AppConfig {@Beanpublic static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();configurer.setIgnoreUnresolvablePlaceholders(false); // 设置为false以抛出异常return configurer;}
}

        通过上述配置,如果Spring在初始化时遇到无法解析的占位符,将会抛出异常并终止启动过程

2.3 自定义占位符前缀和后缀

        PropertySourcesPlaceholderConfigurer允许我们自定义占位符的前缀和后缀,以便更灵活地处理不同格式的占位符。例如,我们可以使用自定义的前缀和后缀来定义占位符:

        

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;@Configuration
public class AppConfig {@Beanpublic static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();configurer.setPlaceholderPrefix("${customPrefix."); // 自定义前缀configurer.setPlaceholderSuffix("}"); // 自定义后缀return configurer;}
}

        在这个示例中,占位符将使用${customPrefix.propertyName}的格式,而不是默认的${propertyName}格式。以下是一个实际的配置示例:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class CustomRecommender {private final String catalog;public CustomRecommender(@Value("${customPrefix.catalog.name}") String catalog) {this.catalog = catalog;}public String getCatalog() {return catalog;}
}

在application.properties文件中定义customPrefix.catalog.name的值:

customPrefix.catalog.name=CustomCatalog

        通过这种方式,我们可以使用自定义的前缀和后缀来解析占位符,使配置文件更加灵活和可读。

        通过这些示例,我们可以看到,PropertySourcesPlaceholderConfigurer是一个强大的工具,能够帮助我们灵活地处理和解析Spring应用程序中的占位符,从而更好地管理和外部化配置。

3. Spring中的内置类型转换功能如何使用

        Spring框架提供了强大的类型转换功能,使得在应用程序中处理各种数据类型变得更加容易。内置的类型转换功能可以自动处理简单类型(如String到Integer)的转换,并且支持更复杂的类型转换需求。以下是详细的使用方法和示例。

3.1 基本类型转换
  1. Spring能够自动将配置文件中的String值转换为常见的简单类型。例如,我们可以将逗号分隔的String值转换为String数组:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class MovieRecommender {private final String[] genres;public MovieRecommender(@Value("${genres}") String[] genres) {this.genres = genres;}public String[] getGenres() {return genres;}
}

        在application.properties文件中定义genres的值:

genres=Action,Comedy,Thriller

        使用上述配置,Spring将自动将逗号分隔的String值转换为String数组并注入到genres字段中。

3.2 自定义类型转换
  1. 有时,我们可能需要处理更复杂的类型转换需求,例如将String转换为自定义的对象类型。为此,我们可以创建一个自定义的Converter并注册到Spring的ConversionService中:

import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;public class StringToGenreConverter implements Converter<String, Genre> {@Overridepublic Genre convert(String source) {return new Genre(source);}
}

接下来,我们需要在配置类中注册这个自定义转换器:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.support.DefaultFormattingConversionService;@Configuration
public class AppConfig {@Beanpublic DefaultFormattingConversionService conversionService() {DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();conversionService.addConverter(new StringToGenreConverter());return conversionService;}
}

现在,我们可以在Spring Bean中使用这个自定义转换器进行类型转换:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class MovieRecommender {private final Genre genre;public MovieRecommender(@Value("${genre}") Genre genre) {this.genre = genre;}public Genre getGenre() {return genre;}
}

在application.properties文件中定义genre的值:

genre=Action
 

使用上述配置,Spring将自动将String值转换为Genre对象并注入到genre字段中。

3.3 集成Spring表达式语言(SpEL)
  1. Spring表达式语言(SpEL)不仅支持简单的类型转换,还支持更复杂的数据处理和转换需求。我们可以在@Value注解中使用SpEL表达式进行动态值计算和注入:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class MovieRecommender {private final int movieCount;public MovieRecommender(@Value("#{T(java.lang.Integer).parseInt('${movie.count}') + 10}") int movieCount) {this.movieCount = movieCount;}public int getMovieCount() {return movieCount;}
}

在application.properties文件中定义movie.count的值:

movie.count=100
 

        使用上述配置,Spring将解析SpEL表达式并将计算结果注入到movieCount字段中。在这个示例中,最终注入的值将是110(100 + 10)。

4. 总结

在本文中,我们详细介绍了如何在Spring框架中使用@Value注解,以及如何配置和使用PropertySourcesPlaceholderConfigurer。具体内容包括:

  1. 如何在Spring中使用@Value注解

    • 基本用法:通过@Value注解将外部化配置文件中的属性值注入到Spring Bean中,例如将catalog.name属性的值注入到MovieRecommender类的catalog字段。
    • 提供默认值:在@Value注解中提供默认值,以确保在缺少配置时应用程序仍能正常工作。
  2. 如何配置和使用PropertySourcesPlaceholderConfigurer

    • 基本配置:定义PropertySourcesPlaceholderConfigurer bean,确保在Spring初始化时解析所有的占位符。
    • 处理未解析的占位符:配置PropertySourcesPlaceholderConfigurer使其在遇到未解析的占位符时抛出异常,从而严格控制配置的完整性。
    • 自定义占位符前缀和后缀:通过setPlaceholderPrefix和setPlaceholderSuffix方法自定义占位符前缀和后缀,确保配置文件的灵活性和可读性。
  3. Spring中的内置类型转换功能如何使用

    • 基本类型转换:Spring自动将配置文件中的String值转换为常见的简单类型,例如将逗号分隔的String值转换为String数组。
    • 自定义类型转换:创建自定义的Converter并注册到Spring的ConversionService中,实现复杂类型的自动转换,例如将String转换为自定义的Genre对象。
    • 集成Spring表达式语言(SpEL):使用SpEL表达式进行动态值计算和注入,实现更复杂的数据处理需求。

        通过这些示例和详细说明,我们可以看到Spring框架提供了丰富而灵活的配置管理和类型转换功能。这些特性使得开发人员能够更加高效地开发和维护应用程序,从而提升代码的可读性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/16077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式进阶——数码管2

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 驱动封装封装的一些疑问数字走马灯实现扩展知识 驱动封装 根据前面的内容可以将代码进行封装&#xff0c;封装后作为一个独立的整…

贪心题目总结

1. 最长递增子序列 我们来看一下我们的贪心策略体现在哪里&#xff1f;&#xff1f;&#xff1f; 我们来总结一下&#xff1a; 我们在考虑最长递增子序列的长度的时候&#xff0c;其实并不关心这个序列长什么样子,我们只是关心最后一个元素是谁。这样新来一个元素之后&#xf…

HTML5 Web组件技术应用

目录 Custom ElementsShadow DOMHTML TemplatesHTML ImportsHTML5 Web Components技术是一组相关标准和API的集合,旨在增强Web开发中的组件化能力,允许开发者创建可重用、封装良好的自定义UI组件,这些组件拥有独立的视图层(样式)、逻辑(行为)和结构(模板)。Web Compon…

【Week-R1】RNN实现心脏病预测,基于tensorflow框架

文章目录 一、什么是RNN&#xff1f;二、准备环境和数据2.1 导入数据 三、构建模型四、训练和预测五、其他&#xff08;1&#xff09;sklearn模块导入报错&#xff1a;ModuleNotFoundError: No module named sklearn&#xff08;2&#xff09;优化器改为SGD&#xff0c;accurac…

类和对象2

三、C对象模型和this指针 3.1 成员变量和成员函数分开存储 在C中&#xff0c;类内的成员变量和成员函数分开存储&#xff0c;只有非静态成员变量才属于类的对象上 #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include <string.h> using namespace …

Linux系统之GoAccess实时Web日志分析工具的基本使用

Linux系统之GoAccess实时Web日志分析工具的基本使用 一、GoAccess介绍1.1 GoAccess简介1.2 GoAccess功能1.3 Web日志格式 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查系统镜像源3.4 更新软件列表…

JavaFX安装与使用

前言 最近学习了javafx,开始时在配置环境和导包时遇到了一些麻烦,关于网上很多方法都尝试过了,现在问题都解决了,和大家分享一下我是怎么实现javafx的配置,希望大家可以通过这个方法实现自己的环境配置! &#x1f648;个人主页: 心.c &#x1f525;文章专题:javafx &#x1f49…

如何在linux命令行(终端)执行ipynb 文件。可以不依赖jupyter

1.安装 runipy pip install runipy 2.终端运行 runipy <YourNotebookName>.ipynb 在终端命令行执行shell脚本&#xff0c;&#xff08;也可以在crontab 中执行&#xff09;&#xff1a; (base) [recommendapp-0-5-B-006 script]$ cat run1.sh #!/bin/bashcd /home/recom…

计算机网络-Traffic-Filter流量过滤策略

一、概述 为提高网络安全性&#xff0c;管理人员需要控制进入网络的流量&#xff0c;将不信任的报文丢弃在网络边界。所谓的不信任报文是指对用户来说存在安全隐患或者不愿意接收的报文。同时保证数据访问安全性&#xff0c;企业网络中经常会要求一些部门之间不能相互访问。 背…

服务器数据恢复—同友存储raid5阵列上层虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 某市教育局同友存储&#xff0c;存储中有一组由数块磁盘组建的raid5阵列&#xff0c;存储空间划分若干lun。每个lun中有若干台虚拟机&#xff0c;其中有数台linux操作系统的虚拟机为重要数据。 存储结构&#xff1a; 服务器故障&#xff1a; r…

前端面试个人技能总结

1.html5新特性 语义化标签&#xff1a;header footer nav section artical aside媒体标签&#xff1a;qudio video &#xff08;control autoplay loop &#xff09; source标签表单新增属性&#xff1a;输入类型type:email url data month week color&#xff1b;新增属性&…

slam14讲(第9,10讲 后端)

slam14讲&#xff08;第9&#xff0c;10讲 后端&#xff09; 后端分类基于滤波器的后端线性系统和卡尔曼滤波非线性系统和扩展卡尔曼滤波 BA优化H矩阵的稀疏性和边缘化H矩阵求解的总结 位姿图优化公式推导 基于滑动窗口的后端个人见解旧关键帧的边缘化 后端分类 基于滤波器的后…

AtCoder Beginner Contest 355 A~F

A.Who Ate the Cake?(思维) 题意 已知有三个嫌疑人&#xff0c;有两个证人&#xff0c;每个证人可以指出其中一个嫌疑人不是罪犯&#xff0c;如果可以排除两个嫌疑人来确定犯人&#xff0c;输出犯人的身份&#xff0c;如果无法确定&#xff0c;输出"-1"。 分析 …

AT_abc351_c [ABC351C] Merge the balls 题解

题目传送门 题目大意 你有一个空序列和 N N N 个球。第 i i i 个球 ( 1 ≤ i ≤ N ) (1 \leq i \leq N) (1≤i≤N) 的大小是 2 A i 2^{A_i} 2Ai​。 计算 N N N 操作后序列中剩余的球的个数。 你将进行 N N N 次运算。 在第 i i i 次操作中&#xff0c;你将第 i i…

springboot + Vue前后端项目(第十一记)

项目实战第十一记 1.写在前面2. 文件上传和下载后端2.1 数据库编写2.2 工具类CodeGenerator生成代码2.2.1 FileController2.2.2 application.yml2.2.3 拦截器InterceptorConfig 放行 3 文件上传和下载前端3.1 File.vue页面编写3.2 路由配置3.3 Aside.vue 最终效果图总结写在最后…

TabAttention:基于表格数据的条件注意力学习

文章目录 TabAttention: Learning Attention Conditionally on Tabular Data摘要方法实验结果 TabAttention: Learning Attention Conditionally on Tabular Data 摘要 医疗数据分析通常结合成像数据和表格数据处理&#xff0c;使用机器学习算法。尽管先前的研究探讨了注意力…

Hudi 多表摄取工具 HoodieMultiTableStreamer 配置方法与示例

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

vue3添加收藏网站页面

结构与样式 <template><div class"web_view"><ul><li v-for"web in webList" :key"web.title"><a :href"web.src" :title"web.title" target"_blank"><img :src"web.img&…

微信小程序基础 -- 小程序UI组件(5)

小程序UI组件 1.小程序UI组件概述 开发文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/view/component.html 什么是组件&#xff1a; 组件是视图层的基本组成单元。 组件自带一些功能与微信风格一致的样式。 一个组件通常包括 开始标签 和 结…