Spring容器Bean之XML配置方式

一、首先看applicationContext.xml里的配置項bean

我們采用xml配置文件的方式對bean進行聲明和管理,每一個bean標簽都代表著需要被創建的對象并通過property標簽可以為該類注入其他依賴對象,通過這種方式Spring容器就可以成功知道我們需要創建那些bean實例

二、ApplicationContext, Spring的容器

然后通過ClassPathXmlApplicationContext去加載spring的配置文件,接著獲取想要的實例bean并調用相應方法執行。對于ClassPathXmlApplicationContext默認加載classpath路徑下的文件,只需指明對應文件的classpath路徑下的配置文件名字即可。如果存在多個配置文件,ClassPathXmlApplicationContext是一個可以接收可變參數的構造函數。實際上ClassPathXmlApplicationContext還有一個孿生兄弟FileSystemXmlApplicationContext,它默認為項目工作路徑 即項目的根目錄 ,至于使用哪個,個人覺得沒多大的差別。

這里, 不管用按哪個方法去獲取spring的配置文件, 返回的都是一個ApplicationContext, Spring的IOC的容器, 但實際上ApplicationContext是一個接口:

?

這里的ConfigurableApplicationContext子接口,給我們提供了一些方法close(), refresh(), 可以讓ApplicationContext刷新和關閉的方法, 后面要用到,這里先認識一下。

ApplicationContext在初始化的時候, 就實例化所有單列的Bean。

具體的從ApplicationContext容器中獲取對象實例的方法getBean:

注意: 平時,我都是用id值來獲取的, 雖然從xxx.class也可以獲取, 但是用這個有個限制: ApplicationContext只有一個這個類型的對象實例, 才能用, 否則會報錯。

三、依賴注入

Spring通過標簽實現依賴注入, Spring支持的注入方式有三種:

①屬性注入

②構造器注入

③工廠方法注入(很少使用, 也不推薦使用,這個就不講了)

1、屬性注入, 也叫Setter注入

Setter注入顧名思義,被注入的屬性需要有set方法, Setter注入支持簡單類型和引用類型,Setter注入是在bean實例創建完成后執行的。直接觀察前面的案例,對象注入使用<property>的ref屬性,對象注入同時也可以注入簡單值和map、set、list、數組,簡單值注入使用<property>的value屬性。

2、構造函數注入

構造注入也就是通過構造方法注入依賴,構造函數的參數一般情況下就是依賴項,spring容器會根據bean中指定的構造函數參數來決定調用那個構造函數,同樣看一個案例:

當然跟setter注入一樣,構造注入也可傳入簡單值類型和集合類型,這個比較簡單,不啰嗦。需要注意的是,當一個bean定義中有多個<constructor-arg>標簽時,它們的放置順序并不重要,因為Spring容器會通過傳入的依賴參數與類中的構造函數的參數進行比較,嘗試找到合適的構造函數。在某些情況下,如某個類,帶有兩個構造函數,參數類型和個數都是一樣的,只是順序不同,這在class的定義中是允許的,但對于Spring容器來說默認會只會去調用前面的。

?

?

如果我們要指定使用哪個構造方法也是可以的,在<constructor-arg>標簽中存在一個index的屬性,通過index屬性可以告訴spring容器傳遞的依賴參數的順序,下面的配置將會令Spring容器成功找到第二個構造函數并調用創建實例。

在日常的開發中,setter注入和構造注入經常會混合使用, 構造注入中index和type也可以混合使用,這并不用感覺到詫異,后面我們還會分析到注解裝配,它在開發中將更為常用。

補充知識點:循環依賴

除了上述的現象,在構造函數注入還有一個無法解決的循環依賴的問題,如下有兩個bean,A和B,這兩個bean通過構造函數互為依賴,這種情況下Spring容器將無法實例化這兩個bean。

這是由于A被創建時,希望B被注入到自身,然而,此時B還有沒有被創建,而且B也依賴于A,這樣將導致Spring容器左右為難,無法滿足兩方需求,最后腦袋奔潰,拋出異常。解決這種困境的方式是使用Setter依賴,但還是會造成一些不必要的困擾,因此,強烈不建議在配置文件中使用循環依賴。

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

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

相關文章

IPython代碼塊粘貼秘籍:效率與技巧的完美結合

標題:IPython代碼塊粘貼秘籍:效率與技巧的完美結合 在數據科學和Python編程的日常實踐中,經常需要在IPython環境中快速有效地粘貼代碼塊。這個過程雖小,卻對提升工作效率至關重要。本文將詳細介紹如何在IPython中粘貼代碼塊&…

comsol隨機材料參數賦值

comsol隨機材料參數賦值 在comsol中定義外部matlab函數 在comsol中定義外部matlab函數 首選項,安全性,允許 材料中,將楊氏模量更改為變量函數 計算 應力有波動,可見賦值成功 也可以看到賦值的材料參數:

植物大戰僵尸雜交版V2.1+修改器+融合版

植物大戰僵尸雜交版v2.1 新增新植物,全新模式與玩法! 內含窗口放大工具與修改器 主播同款游戲,下載使用即可! 鏈接: https://pan.baidu.com/s/1znjbqgBSdqTJWZLBOhe5hA?pwdj6ra 提取碼: j6ra

vulnhub--IMF

環境 攻擊機:192.168.96.4 靶機:ip未知 主機探測 確定靶機ip為32的主機 端口掃描 訪問80端口 外圍打點 在contact.php頁面源碼中找到了flag1 之后沒啥突破 但查看網絡后發現contact.php頁面請求的三個js文件的文件名很有特點,猜測是base64編碼…

模型優化調參利器貝葉斯優化bayesian-optimization實踐

早在之前很多項目尤其是預測類型的項目中,就已經比較廣泛地在實用貝葉斯優化庫了,這是一個非常出色的純python實現的項目,地址在這里,如下所示: 寫這篇文章主要有兩個目的,一方面是覺得這個工具庫挺不錯的值…

零基礎做項目---五子棋對戰---day01

創建項目 這里使用阿里云服務器 https://start.aliyun.com/ 勾選 MyBatis Framework (在SQL分類下)MySQL Driver (在SQL分類下)WebSocket (在Messaging分類下)Spring Web (在Web分類下) 項目結構 消息發送機制 按照當前已有的知識,主要是HTTP HTTP自身是難以實現這…

c++ 里如何檢測內存泄露:比如用了 new ,但沒有用 delete

(1 方法一) 用 MFC 框架的 F5 不帶斷點的調試。可以在輸出窗口提示是否有內存泄露。 (2 方法二) ,在 main 函數中添加如下代碼,用 F5 不帶斷點的調試: int main() {_CrtSetDbgFlag( _CRTDBG_A…

vue.js微商城后臺管理系統

一.需要運行的效果 20240701-231456 二.代碼(解析) 首先,為項目添加依賴: yarn add element-plus --save yarn vue-router4 --save 新建一個項目包,然后命名為商品管理,在components中新建幾個vue文件。 …

React Hooks 深度解析

Hooks簡介 誕生背景: 在React 16.8之前的版本中,組件主要分為函數組件和類組件兩大類。函數組件簡單輕量,但不支持狀態(state)和生命周期方法;而類組件雖然功能強大,但編寫和維護起來相對復雜。…

驅動開發系列-如何與硬件通信

目錄 一:概述 二:I/O端口和I/O內存的概念 三:硬件寄存器(I/O寄存器)和內存 四:使用I/O端口 一:概述 驅動程序是軟件與硬件之間的抽象層;因此,它需要與這兩者對話,本文將向你展示驅動程序如何與硬件對話。并介紹I/O端口和I/O內存的概念。 二:I/O端口和I/O…

C++新特性

C新特性主要體現在語法改進和標準庫擴充兩個方面。以下是一些主要的C新特性: 語法改進 統一的初始化方法:C11擴大了用大括號括起的列表(初始化列表)的使用范圍,使其可用于所有的內置類型和用戶自定義的類型。這種定義…

【C語言】指針(1)--入門理解

目錄 一、內存和地址 二、指針變量和地址 三、指針變量類型的意義 一、內存和地址 只要講指針就離不開內存 因為指針就是訪問內存的 計算上CPU(中央處理器)在處理數據的時候,需要的數據是在內存中讀取的,處理后的數 據也會放…

PY32F030高性能單片機,主頻高達48M,最大64 KB 閃存,8 KB SRAM

PY32F030是普冉的一顆32位高性能MCU,采用32 位 ARM Cortex-M0 內核,高達16~64 Kbytes Flash 和 2~8 Kbytes SRAM 存儲器,最高 48 MHz 工作頻率。PY32F030 單片機的工作溫度范圍為 -40 ~ 105 C,工作電壓范圍為1.7 ~ 5.5 V&#xff…

Centos7刪除MariaDB

在 CentOS 7 上刪除 MariaDB 可以通過 yum 包管理器來完成。以下是一步一步的指導: 打開終端:首先,你需要打開你的 CentOS 7 系統的終端。 停止 MariaDB 服務(如果正在運行):在卸載 MariaDB 之前&#xff…

IDEA實現遠程Debug的步驟與方法

IDEA實現遠程Debug的步驟與方法 在軟件開發過程中,遠程Debug是一個非常重要的功能,它允許開發者在本地IDE中調試遠程服務器上的應用程序。IntelliJ IDEA作為一款強大的Java開發工具,提供了豐富的遠程Debug功能。本文將詳細介紹如何使用IDEA實…

多語言版在線出租車預訂完整源碼+用戶應用程序+管理員 Laravel 面板+ 司機應用程序最新版源碼

源碼帶PHP后臺客戶端源碼 Flutter 是 Google 開發的一款開源移動應用開發 SDK。它用于開發 Android 和 iOS 應用,也是為 Google Fuchsia 創建應用的主要方法。Flutter 小部件整合了所有關鍵的平臺差異,例如滾動、導航、圖標和字體,可在 iOS 和…

DevOps實戰:使用GitLab+Jenkins+Kubernetes(k8s)建立CI_CD解決方案

一.系統環境 本文主要基于Kubernetes1.21.9和Linux操作系統CentOS7.4。 服務器版本docker軟件版本Kubernetes(k8s)集群版本CPU架構CentOS Linux release 7.4.1708 (Core)Docker version 20.10.12v1.21.9x86_64CI/CD解決方案架構圖:CI/CD解決方案架構圖描述:程序員寫好代碼之…

ASP.NET MVC-razor編寫-2-svg中使用js+添加事件監聽

環境:win10 效果 初始狀態: 鼠標移入某個text(比如KS primer)時,text和連接的線條與箭頭都變色: 鼠標移出時回復正常。 如果是移入另一種紅色的text(比如Cell Sceening Tag)&…

創建本地倉庫

一、新建掛載目錄 二、將掛載本地鏡像掛載到目錄 三、配置yum倉庫 一、新建掛載目錄 mkdir /BenDiCangKu 二、將掛載本地鏡像掛載到目錄 1、先連接本地光盤 2、掛載光盤 mount /dev/sr0 /BenDiCangKu 3、查看掛載 由此可見掛載成功 三、配置yum倉庫 1、新建yum倉庫文件…

php簡單商城小程序系統源碼

🛍?【簡單商城小程序】🛍? 🚀一鍵開啟,商城搭建新體驗🚀 你還在為繁瑣的商城搭建流程頭疼嗎?現在,有了簡單商城系統小程序,一切變得輕松又快捷!無需復雜的編程知識&a…