spring容器加載工具類

在Spring框架中,工具類通常不需要被Spring容器管理,但如果確實需要獲取Spring容器中的Bean實例,可以通過靜態方法設置和獲取ApplicationContext。下面是一個典型的Spring容器加載工具類的實現:

這個工具類通過實現ApplicationContextAware接口來注入ApplicationContext,然后提供兩個靜態方法來獲取Bean實例。需要注意的是,此類應該被Spring管理(如使用@Component注解),以便能夠正確地注入ApplicationContext。

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;
import org.springframework.stereotype.Component;import java.util.Map;/*** spring容器加載工具類** @author lcc*/
@Component
public class SpringContext implements ApplicationContextAware {private static ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext context) throws BeansException {SpringContext.setContext(context);}public static ApplicationContext getContext() {return context;}private static void setContext(ApplicationContext context) {SpringContext.context = context;}public static Object getBean(String beanName) {return getContext().getBean(beanName);}public static <T> T getBean(String beanName, Class<T> type) {return getContext().getBean(beanName, type);}public static <T> T getBean(Class<T> type) {return getContext().getBean(type);}public static <T> Map<String, T> getBeansOfType(Class<T> type) {return getContext().getBeansOfType(type);}public static void pushEvent(ApplicationEvent event) {context.publishEvent(event);}
}

實現說明

  1. 靜態變量:定義了一個靜態變量context用于保存ApplicationContext。
  2. setApplicationContext方法:這是ApplicationContextAware接口要求實現的方法,在Spring容器初始化時會自動調用,并將ApplicationContext傳入。
  3. getBean方法:
  • 一個泛型方法,根據Bean的類型來獲取Bean實例。
  • 另一個方法根據Bean的名字來獲取Bean實例。
  • 通過這種方式,你可以在任何地方以靜態方式訪問Spring容器中的Bean,而無需直接依賴于Spring的API。這在某些工具類或者非Spring管理的類中特別有用

使用方法

獲取配置 Bean

DataSource dataSource = SpringContext.getBean(DataSource.class);
Connection connection = dataSource.getConnection();

獲取服務 Bean

MyService myService = SpringContext.getBean(MyService.class);
myService.doSomething();

獲取所有類型的 Bean

Map<String, MyService> myServices = SpringContext.getBeansOfType(MyService.class);
for (Map.Entry<String, MyService> entry : myServices.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue().getName());
}

注意事項

  • 確保工具類被 Spring 管理:SpringContext 類上使用了 @Component 注解,Spring 會自動管理該類。
  • 容器初始化完成后再使用:確保在 Spring 容器初始化完成后調用這些方法,否則可能會拋出空指針異常。
  • 避免在構造函數中調用:在 Bean 的構造函數中避免調用 SpringContext.getBean(),因為此時容器可能還未完全初始化。
  • 推薦使用依賴注入:在 Spring 管理的類中,優先使用 @Autowire 或構造函數注入,而不是直接調用工具類。

最佳實踐

  • 封裝為工具方法:如果某些獲取 Bean 的邏輯頻繁使用,可以封裝為工具方法,提高代碼復用性。
  • 命名清晰:方法名應準確反映其功能,如 getMyService() 表達明確意圖。
  • 避免濫用:盡量減少對 SpringContext 的依賴,優先使用 Spring 提供的依賴注入機制,保持代碼的可測試性和解耦性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89087.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89087.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89087.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

定時器更新中斷與串口中斷

問題&#xff1a;我想把打印姿態傳感器的角度&#xff0c;但是重定向的打印函數突然打印不出來。嘗試&#xff1a;我懷疑是優先級的問題&#xff0c;故調整了串口&#xff0c;定時器&#xff0c;dma的優先級可是發現調了還是沒有用&#xff0c;最終發現&#xff0c;我把定時器中…

用Python向PDF添加文本:精確插入文本到PDF文檔

PDF 文檔的版式特性使其適用于輸出不可變格式的報告與合同。但若要在此類文檔中插入或修改文本&#xff0c;常規方式難以實現。借助Python&#xff0c;我們可以高效地向 PDF 添加文本&#xff0c;實現從文檔生成到內容管理的自動化流程。 本文將從以下方面介紹Python實現PDF中…

Quick API:賦能能源行業,化解數據痛點

隨著全球能源結構的轉型和數字化的深入推進&#xff0c;能源行業正面臨前所未有的機遇與挑戰。海量的實時數據、復雜的業務系統、以及對數據安全和高效利用的迫切需求&#xff0c;都成為了能源企業在數字化轉型道路上的核心痛點。本文將深入探討麥聰Quick API如何憑借其獨特優勢…

Google Chrome V8< 13.6.86 類型混淆漏洞

【高危】Google Chrome V8< 13.6.86 類型混淆漏洞 漏洞描述 Google Chrome 是美國谷歌&#xff08;Google&#xff09;公司的一款Web瀏覽器&#xff0c;V8 是 Google 開發的高性能開源 JavaScript 和 WebAssembly 引擎&#xff0c;廣泛應用于 Chrome 瀏覽器和 Node.js 等環…

力扣經典算法篇-23-環形鏈表(哈希映射法,快慢指針法)

1、題干 給你一個鏈表的頭節點 head &#xff0c;判斷鏈表中是否有環。 如果鏈表中有某個節點&#xff0c;可以通過連續跟蹤 next 指針再次到達&#xff0c;則鏈表中存在環。 為了表示給定鏈表中的環&#xff0c;評測系統內部使用整數 pos 來表示鏈表尾連接到鏈表中的位置&…

HarmonyOS DevEco Studio 小技巧 42 - 鴻蒙單向數據流

在鴻蒙應用開發中&#xff0c;狀態管理是構建響應式界面的核心支柱&#xff0c;而 單向數據流&#xff08;Unidirectional Data Flow, UDF&#xff09;作為鴻蒙架構的重要設計原則&#xff0c;貫穿于組件通信、狀態更新和界面渲染的全流程。本文將結合鴻蒙 ArkUI 框架特性&…

【LeetCode 3136. 有效單詞】解析

目錄LeetCode中國站原文原始題目題目描述示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a;提示&#xff1a;講解化繁為簡&#xff1a;如何優雅地“盤”邏輯判斷題第一部分&#xff1a;算法思想 —— “清單核對”與“一票否決”第二部分&#xff1a;代碼實現 —— 清晰…

前端面試專欄-算法篇:24. 算法時間與空間復雜度分析

&#x1f525; 歡迎來到前端面試通關指南專欄&#xff01;從js精講到框架到實戰&#xff0c;漸進系統化學習&#xff0c;堅持解鎖新技能&#xff0c;祝你輕松拿下心儀offer。 前端面試通關指南專欄主頁 前端面試專欄規劃詳情 算法時間與空間復雜度分析&#xff1a;從理論到實踐…

bash中||與的區別

在 Bash 中&#xff0c;|| 和 && 是兩種常用的邏輯操作符&#xff0c;用于控制命令的執行流程。它們的核心區別如下&#xff1a;1. ||&#xff08;邏輯 OR&#xff09; 作用&#xff1a;如果前一個命令失敗&#xff08;返回非零退出碼&#xff09;&#xff0c;則執行后…

OpenCV實現感知哈希(Perceptual Hash)算法的類cv::img_hash::PHash

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 PHash是OpenCV中實現感知哈希&#xff08;Perceptual Hash&#xff09;算法的類。該算法用于快速比較圖像的視覺相似性。它將圖像壓縮為一個簡短的…

數據庫遷移人大金倉數據庫

遷移前的準備工作 安裝官方的kdts和KStudio工具 方案說明 一、數據庫遷移&#xff1a;可以使用kdts進行數據庫的按照先遷移表結構、后數據的順序遷移&#xff08;kdts的使用可以參考官方文檔&#xff09; 其他參考文檔 人大金倉官網&#xff1a;https://download.kingbase…

uniapp 微信小程序Vue3項目使用內置組件movable-area封裝懸浮可拖拽按鈕(拖拽結束時自動吸附到最近的屏幕邊緣)

一、最終效果 二、具體詳情請看movable-area與movable-view官方文檔說明 三、參數配置 1、代碼示例 <TFab title"新建訂單" click"addOrder" /> // title:表按鈕文案 // addOrder:點擊按鈕事件四、組件源碼 <template><movable-area cl…

linux kernel為什么要用IS_ERR()宏來判斷指針合法性?

在 Linux 內核中&#xff0c;IS_ERR() 宏的設計與內核的錯誤處理機制和指針編碼規范密切相關&#xff0c;主要用于判斷一個“可能攜帶錯誤碼的指針”是否代表異常狀態。其核心目的是解決內核中指針返回值與錯誤碼的統一表示問題。以下從技術背景、設計邏輯和實際場景三個維度詳…

Cookie與Session:Web開發核心差異詳解

理解 Cookie 和 Session 的區別對于 Web 開發至關重要,它們雖然經常一起使用,但扮演著不同的角色。核心區別在于: Cookie:存儲在客戶端(用戶的瀏覽器)的數據片段。 Session:存儲在服務器端的數據結構,用于跟蹤特定用戶的狀態。 下面是詳細的對比: 特性CookieSession…

【相干、相參】 雷電名詞溯源

〇、廢話因緣 最近某些國產的微波制造公司總是提到一個概念【相干】【相參】【嚴格相參】等等概念層出不窮&#xff0c;讓人苦惱。 一、這玩意還是英文溯源吧 這幾個概念都聚焦在一個單詞【Coherence】&#xff1b;所以就是說兩個波形之間有某種聯系&#xff0c;不一定就是完全…

MYSQL練習2

一、對mydb11_stu庫進行查詢步驟1.創建mydb11_stu庫并使用2.創建score表和student表3.向兩張表插入數據student表&#xff1a;score表&#xff1a;4.完成查詢&#xff08;1&#xff09;分別查詢student表和score表的所有記錄&#xff08;2&#xff09;查詢student表的第2小到5條…

Spring Boot全局異常處理:打造堅如磐石的應用防線

引言在當今的軟件開發領域&#xff0c;隨著業務的日益復雜和系統規模的不斷擴大&#xff0c;Spring Boot 已成為 Java 開發中備受青睞的框架。它以其強大的功能、便捷的配置和快速的開發體驗&#xff0c;幫助開發者們高效地構建各種應用程序。在 Spring Boot 應用的開發過程中&…

藥品掛網價、藥品集采價格、藥品上市價格一鍵查詢!

相信許多人在查詢藥品價格時感到無從下手&#xff0c;那是因為對藥品定價機制和標準的不了解&#xff0c;醫院及藥店的藥品價格查詢可通過筆者之前的文章進行了解&#xff1a;如何查詢藥品的價格&#xff08;醫院&藥店&鄉鎮衛生院&#xff09;&#xff1f; 而今天筆者要…

【iOS】方法與消息底層分析

目錄 前言 方法的本質 向不同對象發送消息 發送實例方法 發送類方法 對象調用方法 實際執行是父類 向父類發送類方法 消息查找流程 開始查找 快速查找流程 慢速查找流程 動態方法決議 應用場景 優化方案 消息轉發機制 快速轉發流程 應用場景 慢速轉發流程 應…

如何通過 WebSocket 接口訂閱實時外匯行情數據(PHP 示例)

步驟 1&#xff1a;準備工作確保已安裝 PHP 和 Composer安裝 WebSocket 客戶端庫&#xff1a;composer require textalk/websocket步驟 2&#xff1a;編寫代碼訂閱行情以下是最簡可運行的 PHP 示例&#xff0c;訂閱 EUR/USD 的 1分鐘K線數據&#xff1a;<?phprequire vendo…