BeanFactory 是什么?它與 ApplicationContext 有什么區別?

????????談到Spring,那勢必要講講容器 BeanFactory 和 ApplicationContext。

BeanFactory是什么?

????????BeanFactory,其實就是 Spring 容器,用于管理和操作 Spring 容器中的 Bean。可能此時又有初學的小伙伴會問:Bean 是什么?其實這就是對象,只不過這個對象是被 Spring Ioc 容器管理的。

BeanFactory 的主要功能

1. 創建 Bean

? ?BeanFactory 負責創建和管理 Bean 的生命周期。簡單來說,它就像是一個工廠,負責生產(創建)各種對象(Bean)。這些對象在創建時,BeanFactory 會根據配置文件(如 XML 文件)中的定義,初始化這些對象的屬性和行為。

2. 依賴注入

? ?BeanFactory 通過依賴注入(DI)機制將依賴關系注入到 Bean 中。想象一下,一個對象(Bean)需要使用另一個對象(依賴)來完成某些任務。BeanFactory 會自動將這些依賴對象注入到需要它們的 Bean 中,這樣你就不需要在代碼中手動創建這些依賴對象,使得代碼更加簡潔和易于維護。

3. 獲取 Bean

? ?BeanFactory 提供了方法來獲取 Bean 實例。當你需要使用某個 Bean 時,你可以通過 BeanFactory 提供的方法(如 getBean)來獲取這個 Bean 的實例。這個過程就像是從工廠中取出一個已經生產好的產品一樣簡單。

????????下面舉一個例子:通過 BeanFactory 獲取所有的單例 Bean。

@SpringBootApplication
public class Application {public static void main(String[] args) {// 啟動 Spring 應用ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);// 通過反射獲取 DefaultSingletonBeanRegistry 類中的 singletonObjects 字段Field singletonObjectsField;try {singletonObjectsField = DefaultSingletonBeanRegistry.class.getDeclaredField("singletonObjects");singletonObjectsField.setAccessible(true);// 獲取當前 Spring 容器的 BeanFactoryConfigurableListableBeanFactory beanFactory = context.getBeanFactory();// 通過反射獲取 singletonObjects 字段的值Map<String, Object> singletonObjects = (Map<String, Object>) singletonObjectsField.get(beanFactory);// 打印所有單例 BeansingletonObjects.forEach((beanName, beanInstance) -> {System.out.println(beanName + ": " + beanInstance.getClass().getName());});} catch (NoSuchFieldException | IllegalAccessException e) {e.printStackTrace();}// 關閉 Spring 容器context.close();}
}

????????另外,需要自己提前創建好 bean。方法有很多,簡便點,直接加類上加 @Component 即可,這使得該類可以被 Spring 容器自動檢測并注冊為一個 Bean。如下所示:

@Component
public class MyComponent {public void doSomething() {System.out.println("Doing something...");}
}

那它與 ApplicationContext 有什么區別?

????????可以從圖中看出,ApplicationContext?可以說是更高級的容器,它繼承并擴展了 BeanFactory 的功能,提供了更多的功能。具體來說,ApplicationContext 多繼承了以下幾個接口:

  • MessageSource:提供國際化消息支持,可以用于多語言應用。

  • EnvironmentCapable:提供環境變量的訪問功能,可以獲取系統環境變量和配置文件中的屬性。

  • ResourcePatternResolver:提供資源路徑解析功能,可以方便地加載資源文件。

  • ApplicationEventPublisher:提供事件發布功能,可以發布和監聽應用事件。

總結

?????BeanFactory:是最基本的 Spring 容器接口,提供 Bean 的創建、配置和組裝功能。適用于資源受限的環境,啟動速度快。

?????ApplicationContext:是 BeanFactory 的子接口,提供了更多的高級功能,如事件傳播、國際化消息支持、資源訪問等。適用于大多數企業級應用,啟動時會自動初始化所有單例 Bean,提供更多的功能和便利性。

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

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

相關文章

【深度學習】Huber Loss詳解

文章目錄 1. Huber Loss 原理詳解2. Pytorch 代碼詳解3.與 MSELoss、MAELoss 區別及各自優缺點3.1 MSELoss 均方誤差損失3.2 MAELoss 平均絕對誤差損失3.3 Huber Loss 4. 總結4.1 優化平滑4.2 梯度較好4.3 為什么說 MSE 是平滑的 1. Huber Loss 原理詳解 Huber Loss 是一種結合…

python實現pdf轉word和excel

一、引言   在辦公中&#xff0c;我們經常遇收到pdf文件格式&#xff0c;因為pdf格式文件不易修改&#xff0c;當我們需要編輯這些pdf文件時&#xff0c;經常需要開通會員或收費功能才能使用編輯功能。今天&#xff0c;我要和大家分享的&#xff0c;是如何使用python編程實現…

【PyCharm】連接Jupyter Notebook

【PyCharm】相關鏈接 【PyCharm】連接 Git【PyCharm】連接Jupyter Notebook【PyCharm】快捷鍵使用【PyCharm】遠程連接Linux服務器【PyCharm】設置為中文界面 【PyCharm】連接Jupyter Notebook PyCharm連接Jupyter Notebook的過程可以根據不同的需求分為 本地連接 和 遠程連…

Java鎖 公平鎖和非公平鎖 ReentrantLock() 深入源碼解析

賣票問題 我們現在有五個售票員 五個線程分別賣票 賣票 ReentrantLock(); 運行后全是 a 對象獲取 非公平鎖缺點之一 容易出現鎖饑餓 默認是使用的非公平鎖 也可以傳入一個 true 參數 使其變成公平鎖 生活中排隊講求先來后到 視為公平 程序中的公平性也是符合請求鎖的絕對…

「劉一哥GIS」系列專欄《GRASS GIS零基礎入門實驗教程(配套案例數據)》專欄上線了

「劉一哥GIS」系列專欄《GRASS GIS零基礎入門實驗教程》全新上線了&#xff0c;歡迎廣大GISer朋友關注&#xff0c;一起探索GIS奧秘&#xff0c;分享GIS價值&#xff01; 本專欄以實戰案例的形式&#xff0c;深入淺出地介紹了GRASS GIS的基本使用方法&#xff0c;用一個個實例講…

企業級NoSQL數據庫Redis

1.瀏覽器緩存過期機制 1.1 最后修改時間 last-modified 瀏覽器緩存機制是優化網頁加載速度和減少服務器負載的重要手段。以下是關于瀏覽器緩存過期機制、Last-Modified 和 ETag 的詳細講解&#xff1a; 一、Last-Modified 頭部 定義&#xff1a;Last-Modified 表示服務器上資源…

使用Flask和Pydantic實現參數驗證

使用Flask和Pydantic實現參數驗證 1 簡介 Pydantic是一個用于數據驗證和解析的 Python 庫&#xff0c;版本2的性能有較大提升&#xff0c;很多框架使用Pydantic做數據校驗。 # 官方參考文檔 https://docs.pydantic.dev/latest/# Github地址 https://github.com/pydantic/pyd…

ScratchLLMStepByStep:訓練自己的Tokenizer

1. 引言 分詞器是每個大語言模型必不可少的組件&#xff0c;但每個大語言模型的分詞器幾乎都不相同。如果要訓練自己的分詞器&#xff0c;可以使用huggingface的tokenizers框架&#xff0c;tokenizers包含以下主要組件&#xff1a; Tokenizer: 分詞器的核心組件&#xff0c;定…

C# OpenCvSharp 部署3D人臉重建3DDFA-V3

目錄 說明 效果 模型信息 landmark.onnx net_recon.onnx net_recon_mbnet.onnx retinaface_resnet50.onnx 項目 代碼 下載 參考 C# OpenCvSharp 部署3D人臉重建3DDFA-V3 說明 地址&#xff1a;https://github.com/wang-zidu/3DDFA-V3 3DDFA_V3 uses the geometri…

從零開始學數據庫 day2 DML

從零開始學數據庫&#xff1a;DML操作詳解 在今天的數字化時代&#xff0c;數據庫的使用已經成為了各行各業的必備技能。無論你是想開發一個簡單的應用&#xff0c;還是想要管理復雜的數據&#xff0c;掌握數據庫的基本操作都是至關重要的。在這篇博客中&#xff0c;我們將專注…

Java 8 Stream API

文章目錄 Java 8 Stream API1. Stream2. Stream 的創建3. 常見的 Stream 操作3.1 中間操作3.2 終止操作 4. Stream 的并行操作 Java 8 Stream API Java 8 引入了 Stream API&#xff0c;使得對集合類&#xff08;如 List、Set 等&#xff09;的操作變得更加簡潔和直觀。Stream…

運行fastGPT 第五步 配置FastGPT和上傳知識庫 打造AI客服

運行fastGPT 第五步 配置FastGPT和上傳知識庫 打造AI客服 根據上一步的步驟&#xff0c;已經調試了ONE API的接口&#xff0c;下面&#xff0c;我們就登陸fastGPT吧 http://xxx.xxx.xxx.xxx:3000/ 這個就是你的fastGPT后臺地址&#xff0c;可以在configer文件中找到。 賬號是…

第4章 Kafka核心API——Kafka客戶端操作

Kafka客戶端操作 一. 客戶端操作1. AdminClient API 一. 客戶端操作 1. AdminClient API

【王樹森搜索引擎技術】相關性02:評價指標(AUC、正逆序比、DCG)

相關性的評價指標 Pointwise評價指標&#xff1a;Area Under the Curve&#xff08;AUC&#xff09;Pairwise評價指標&#xff1a;正逆序比&#xff08;Positive to Negative Ratio, PNR&#xff09;Listwise評價指標&#xff1a;Discounted Cumulative Gain(DCG)用AUC和PNR作…

人物一致性訓練測評數據集

1.Pulid 訓練:由1.5M張從互聯網收集的高質量人類圖像組成,圖像標題由blip2自動生成。 測試:從互聯網上收集了一個多樣化的肖像測試集,該數據集涵蓋了多種膚色、年齡和性別,共計120張圖像,我們稱之為DivID-120,作為補充資源,還使用了最近開源的測試集Unsplash-50,包含…

Android 項目依賴沖突問題:Duplicate class found in modules

問題描述與處理處理 1、問題描述 plugins {id com.android.application }android {compileSdk 34defaultConfig {applicationId "com.my.dialog"minSdk 21targetSdk 34versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.run…

計算機網絡 | 什么是公網、私網、NAT?

關注&#xff1a;CodingTechWork 引言 計算機網絡是現代信息社會的基石&#xff0c;而網絡通信的順暢性和安全性依賴于有效的IP地址管理和網絡轉換機制。在網絡中&#xff0c;IP地址起到了標識設備和進行數據傳輸的核心作用。本文將詳細討論公網IP、私網IP以及NAT轉換等網絡技…

python+django+Nacos實現配置動態更新-集中管理配置(實現mysql配置動態讀取及動態更新)

一、docker-compose.yml 部署nacos服務 version: "3" services:mysql:container_name: mysql# 5.7image: mysql:5.7environment:# mysql root用戶密碼MYSQL_ROOT_PASSWORD: rootTZ: Asia/Shanghai# 初始化數據庫(后續的初始化sql會在這個庫執行)MYSQL_DATABASE: nac…

深度學習項目--基于LSTM的火災預測研究(pytorch實現)

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 前言 LSTM模型一直是一個很經典的模型&#xff0c;這個模型當然也很復雜&#xff0c;一般需要先學習RNN、GRU模型之后再學&#xff0c;GRU、LSTM的模型講解將…

基于 WEB 開發的汽車養護系統設計與實現

標題:基于 WEB 開發的汽車養護系統設計與實現 內容:1.摘要 本文介紹了基于 WEB 開發的汽車養護系統的設計與實現。文章首先闡述了系統的背景和目的&#xff0c;即隨著汽車保有量的增加&#xff0c;汽車養護需求日益增長&#xff0c;傳統的汽車養護方式已經無法滿足人們的需求&…