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.pswp.cn/web/16077.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/16077.shtml
英文地址,請注明出處:http://en.pswp.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; 組件是視圖層的基本組成單元。 組件自帶一些功能與微信風格一致的樣式。 一個組件通常包括 開始標簽 和 結…