Spring 中常用的手動裝載 bean 方法

在 Spring 的 bean 裝載條件中,雖然 Spring 給我們提供了非常好用便捷的 Condition?相關注解,但是很多時候 Condition 相關注解并不滿足我們的需求,我需要更復雜的條件手動控制是否裝置 bean。這個時候我們就可以實現 Spring 為我們提供的幾個接口來實現手動 bean 的注入。

一、ApplicationContextAware 接口

在某些特殊的情況下,bean 需要實現某個功能,但該功能必須借助于 Spring 容器才能實現,此時就必須讓該 bean 先獲取 Spring 容器,然后借助于 Spring 容器實現該功能。為了讓 bean 獲取它所在的 Spring 容器,可以讓該 bean 實現 ApplicationContextAware 接口。ApplicationContextAware 通過它 Spring 容器會自動把上下文環境對象調用ApplicationContextAware 接口中的 setApplicationContext 方法。在 ApplicationContextAware 的實現類中,就可以通過這個上下文環境對象得到 Spring 容器中的 bean。

@Component
public class MyContextAware implements ApplicationContextAware {@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println("SpringWebSocketContextAware");// 將 applicationContext 轉換為 ConfigurableApplicationContextConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;// 獲取 BeanFactoryDefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getAutowireCapableBeanFactory();// 創建 bean 信息BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(Test.class);// 動態注冊 beandefaultListableBeanFactory.registerBeanDefinition("test", beanDefinitionBuilder.getBeanDefinition());}
}

?二、BeanDefinitionRegistryPostProcessor 接口

Spring 中并沒有具體去實現 postProcessBeanFactory 方法,是提供給想要實現BeanPostProcessor 的三方框架使用的。誰要使用誰就去實現。作用是在 BeanFactory 準備工作完成后做一些定制化的處理,一般結合 BeanPostProcessor 接口的實現類一起使用,注入一些重要資源。

@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Test.class).getBeanDefinition();registry.registerBeanDefinition("test", beanDefinition);}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {BeanDefinitionRegistryPostProcessor.super.postProcessBeanFactory(beanFactory);}
}

三、ImportBeanDefinitionRegistrar 接口

在 spring 應用啟動過程,一些被 @Import 注解的類(這些類都實現了 ImportBeanDefinitionRegistrar 接口)會執行 ImportBeanDefinitionRegistrar 的registerBeanDefinitions 方法,然后生成 BeanDefinition 對象,并最終注冊到BeanDefinitionRegistry 中,為后續實例化 bean 做準備的。

@Component
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(@NotNull AnnotationMetadata importingClassMetadata,@NotNull BeanDefinitionRegistry registry,@NotNull BeanNameGenerator importBeanNameGenerator) {this.registerBeanDefinitions(importingClassMetadata, registry);}@Overridepublic void registerBeanDefinitions(@NotNull AnnotationMetadata importingClassMetadata,BeanDefinitionRegistry registry) {BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Test.class).getBeanDefinition();registry.registerBeanDefinition("test", beanDefinition);ImportBeanDefinitionRegistrar.super.registerBeanDefinitions(importingClassMetadata, registry);}
}

接口執行順序:ImportBeanDefinitionRegistrar ->?BeanDefinitionRegistryPostProcessor ->?ApplicationContextAware?

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

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

相關文章

域名DNS添加CAA記錄

目錄 概述 檢測CAA記錄 添加CAA記錄 概述 DNS CAA(Certificate Authority Authorization)記錄是一種不太常見的DNS記錄類型,它主要用于鎖定證書頒發機構(CA)列表,以確保只有特定的CA可以為某個域名頒發SSL/TLS證書。CAA記錄是保護域名免受釣魚攻擊的安全措施,通過限制…

v-md-editor和SSE實現ChatGPT的打字機式輸出

概述 不論是GPT還是文心一言,在回答的時候類似于打字機式的將答案呈現給我們,這樣的交互一方面比較友好,另一方面,當答案比較多、生成比較慢的時候也能爭取一些答案的生成時間。本文后端使用express和stream,使用SSE將…

Boosting Cache Performance by Access Time Measurements——論文泛讀

TOC 2023 Paper 論文閱讀筆記整理 問題 大多數現代系統利用緩存來減少平均數據訪問時間并優化其性能。當緩存未命中的訪問時間不同時,最大化緩存命中率與最小化平均訪問時間不同。例如:系統使用多種不同存儲介質時,不同存儲介質訪問時間不同…

【C++初階】—— 類和對象 (上)

📝個人主頁🌹:EterNity_TiMe_ ?收錄專欄?:C “ 登神長階 ” 🌹🌹期待您的關注 🌹🌹 類和對象 1. 初步認識C2. 類的引入3. 類的定義聲明和定義全部放在類體中聲明和定義分開存放 4.…

8個實用網站和軟件,收藏起來一定不后悔~

整理了8個日常生活中經常能用得到的網站和軟件,收藏起來一定不會后悔~ 1.ZLibrary zh.zlibrary-be.se/這個網站收錄了超千萬的書籍和文章資源,國內外的各種電子書資源都可以在這里搜索,98%以上都可以在網站內找到,并且支持免費下…

Android系統的/etc/mkshrc文件

/etc/mkshrc 文件是用于配置 mksh(MirBSD Korn Shell)環境的啟動腳本。mksh 是 Android 默認使用的 shell,在 shell 啟動時會讀取并執行這個文件中的配置。以下是關于 /etc/mkshrc 文件的詳細信息及其用途。 /etc/mkshrc 文件的作用 環境配…

sql server專題實驗4 復雜查詢

SQL Server 是微軟開發的數據庫管理系統,它支持復雜的查詢操作,允許用戶從數據庫中檢索、分析和處理數據。在進行復雜查詢時,通常會用到以下幾種SQL語句和概念: 連接(Join): INNER JOIN:只返回兩…

設計模式--備忘錄模式

備忘錄模式是一種行為設計模式,它用于在不破壞封裝的前提下,保存一個對象的內部狀態,以便以后可以恢復到這個狀態。這種模式在許多應用場景中非常有用,例如在實現撤銷操作、保存游戲進度、恢復文件備份以及保持工作狀態等。 備忘…

linux中ansible整理筆記

一、工作模式 1. adhoc臨時命令 語法: ansible 主機或者組列表 -m 模塊 -a “參數” 2. playbook 語法: ansible-playbook xxx.yml 二、模塊 1. ping 2.command:默認模塊(不支持重定向,管道) 3.shell:類似com…

IP地址顯示“不安全”怎么辦|已解決

解決IP地址顯示“不安全”的問題,通常需要確保網站或服務使用HTTPS協議進行加密通信,可以通過部署SSL證書來解決,以下是具體的解決步驟: 1 申請IP地址SSL證書:網站管理員應向證書頒發機構(CA)申…

網絡拓撲—WEB-IIS服務搭建

文章目錄 WEB-IIS服務搭建網絡拓撲配置網絡IISPC 安裝IIS服務配置IIS服務(默認站點)PC機訪問網頁 配置IIS服務(新建站點)PC機訪問網頁 WEB-IIS服務搭建 網絡拓撲 //交換機忽略不計 IIS服務IP:192.168.1.1 PC機IP&…

人類交互2 聽覺處理和語言中樞

人類聽覺概述 人類聽覺是指通過耳朵接收聲音并將其轉化為神經信號,從而使我們能夠感知和理解聲音信息的能力。聽覺是人類五種感覺之一,對我們的日常生活和交流至關重要。 聽覺是人類交流和溝通的重要工具。通過聽覺,我們能夠聽到他人的語言…

安裝錯誤提示Please run MaterialLibrary2018.msi first或者其他MaterialLibrary版本

打開autoremove,系統檢查,點擊開始檢查。檢查完成修復。 可以解決部分該問題,如果沒解決的請咨詢

Linux中的文件描述符

1.系統調用接口和庫函數的關系 函數:fopen fclose fread fwrite 都是c標準庫當中的函數,也就是用戶操作接口中ibc系統調用:open close read write 都是系統調用提供的接口 c語言中接口底層封裝的都是系統調用接口 FILE* stdin stdout stderr…

[POI2008] STA-Station/洛谷P3478(樹形dp)

[ P O I 2008 ] S T A ? S t a t i o n ( 樹形 d p ) \Huge{[POI2008] STA-Station(樹形dp)} [POI2008]STA?Station(樹形dp) 題目鏈接:[P3478 POI2008] STA-Station - 洛谷 文章目錄 題意思路標程 題意 給定一個 n n n個點的樹,請求出一個結點&#…

js無感刪除url搜索部分,不刷新頁面

如:把下面的網址 http://127.0.0.1:5173/?code3b9cc36e&state 改成 http://127.0.0.1:5173 history.pushState(null, 網站標題, location.origin)

TikTok越獄檢測之二 <調試器檢測>

來了,調試器檢測。總結如下,多多指教: 檢測app 是否被附加調試: 原理就是檢測父進程是否 launchd啟動,在OS X和iOS 系統中,用戶環境始于launchd,為用戶態出現的第一個進程,為所有的進程的祖先,launchd 的進…

Python模塊、包和異常處理

大家好,在當今軟件開發領域,Python作為一種簡潔、易讀且功能強大的編程語言,被廣泛應用于各種領域。作為一名測試開發工程師,熟練掌握Python的模塊、包和異常處理是提高代碼可維護性和錯誤處理能力的關鍵。本文將和大家一起探討Py…

SAP-MRP和采購申請

1、如果采購申請是手工創建的,跑MRP會不會被覆蓋? 創建一個采購申請18089476,然后運行MRP-MD03,再用MD04查看下 從上圖看,手工創建的采購申請被打上*號,沒有被覆蓋掉。 2、如果采購申請被審批了,會不會被覆蓋掉? 首先創建一個獨立需求MD61 然后庫存消耗掉為0,運行M…

shell實現ssh服務防止暴力破解 —— 筑夢之路

實現原理 對系統登陸日志文件/var/log/secure,進行數據篩選,查找登陸失敗的ip地址,然后將ip加入到黑名單中。 腳本內容 #!/bin/bash# 獲取登陸失敗的ip地址failedcat /var/log/secure|grep "Failed"|awk {print $11}|sort|uniq …