日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

详解Spring框架的依赖注入

發(fā)布時間:2025/3/15 javascript 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 详解Spring框架的依赖注入 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本篇主要介紹Spring的依賴注入。依賴注入是Spring協(xié)調(diào)不同Bean實例之間的合作而提供的一種工作機制,在確保Bean實例之間合作的同時,并能保持每個Bean的相對獨立性。通過本篇的學習,可以達成如下目標。

● 理解基于構(gòu)造函數(shù)的依賴注入

● 理解基于設置函數(shù)的依賴注入

● 基于自動裝配的依賴注入

● 基于注解的依賴注入

在Spring框架下,當Bean實例 A運行過程中需要引用另外一個Bean實例B時,Spring框架會創(chuàng)建Bean的實例B,并將實例B通過實例A的構(gòu)造函數(shù)、set方法、自動裝配和注解方式注入到實例A,這種注入實例Bean到另外一個實例Bean的過程稱為依賴注入。

在課程案例SpringProgram項目中,事務組件類EmailNotice內(nèi)部引用了實體類Teacher類,用于向Teacher類發(fā)送消息,因此EmailNotice類依賴于Teacher類。Spring IOC容器會在創(chuàng)建EmailNotice類和Teacher類的實例后,將Teacher類的實例注入到EmailNotice類的實例中。

依賴注入的好處就是盡可能隔離Bean之間的代碼耦合,提高Bean重用的可能性,并盡量降低程序代碼的維護難度。Spring框架通過依賴注入技術(shù)將不同的Bean融合起來,完成復雜業(yè)務操作,但又確保了每個Bean相對的獨立性。

Spring框架提供了構(gòu)造函數(shù)注入、設置方法注入、自動裝配注入和注解注入四種注入方式,下面分別進行討論并說明。

?

1、 基于構(gòu)造函數(shù)的依賴注入

構(gòu)造函數(shù)注入就是通過Bean類的構(gòu)造方法,將Bean所依賴的對象注入。構(gòu)造函數(shù)的參數(shù)一般情況下就是依賴項,spring容器會根據(jù)bean中指定的構(gòu)造函數(shù)參數(shù)來決定調(diào)用那個構(gòu)造函數(shù)。

在課程案例SpringProgram項目中新建發(fā)送通知組件類ShortNotice類,代碼如下:

?

? ? ? ? ? ? ? ? ? ? ? ?

ShortNotice類依賴實體Teacher類,由ShortNotice類的構(gòu)造函數(shù)注入。

在課程案例SpringProgram項目的config目錄下新建structure.xml配置文件,配置文件代碼如下:

?

? ? ? ? ? ? ? ? ? ? ? ?

構(gòu)造注入可以傳入簡單值或?qū)ο箢愋?#xff0c;注入?yún)?shù)使用<constructor-arg>標簽。如果注入不止一個參數(shù)時,當把參數(shù)傳遞給構(gòu)造函數(shù)時,可能會存在歧義。要解決這個問題,就要確保在構(gòu)造函數(shù)定義的參數(shù)順序,與在配置文件中定義的注入?yún)?shù)順序一致。

例如,下面的類

?

? ? ? ? ? ? ? ? ? ? ?

在配置文件需要做如下定義:

?

? ? ? ? ? ? ? ? ? ? ?

在配置文件中,也可以使用type 屬性顯式指定構(gòu)造函數(shù)參數(shù)的類型,容器允許使用與簡單類型匹配的類型。

例如,下面的類

?

? ? ? ? ? ? ? ? ? ? ?

配置文件可以做如下定義:

?

? ? ? ? ? ? ? ? ? ? ?

另外,使用構(gòu)造函數(shù)注入需要注意的是,如果需要向一個對象傳遞一個引用,需要使用標簽的 ref 屬性,如果需要直接傳遞值,那么應該使用如上所示的 value 屬性。

?

2、基于設置函數(shù)的依賴注入

將Bean所依賴的對象通過設置函數(shù)注入,Bean需要為注入的依賴對象提供設置方法。

在課程案例SpringProgram項目中,發(fā)送通知組件類EmailNotice依賴實體類Teacher,向Teacher類發(fā)送消息。EmailNotice類提供了設置Teacher類的方法,Spring IOC容器創(chuàng)建EmailNotice和Teacher實例后,調(diào)用EmailNotice類設置Teacher類的方法,將Teacher實例注入到EmailNotice實例。EmailNotice類代碼如下:

?

? ? ? ? ? ? ? ? ? ? ?

EmailNotice類有值屬性和對象引用屬性,值屬性為message,對象引用屬性為teacher。值屬性可以通過value注入,對象引用屬性需要通過ref注入。注入標簽使用<property>。配置文件代碼如下。

?

? ? ? ? ? ? ? ? ? ? ?

Spring IOC容器除了向Bean注入簡單對象外,也可以向Bean注入集合對象。如map、list、set、數(shù)組等集合對象。

在課程案例SpringProgram項目中新建實體類Student,Student類有info和courses兩個屬性,info是Map對象,用于記錄學生的基本信息,courses是List對象,用于記錄學生學習的課程名稱。

?

? ? ? ? ? ? ? ? ? ? ?

Spring配置文件的注入代碼如下。

?

? ? ? ? ? ? ? ? ? ? ?

?

3、基于自動裝配的依賴注入

前面討論了基于構(gòu)造函數(shù)的依賴注入和基于設置函數(shù)的依賴注入。了解了在Spring配置文件中使用<constructor-arg>和<property>標簽注入Bean的依賴對象。Spring 容器還可以在不使用<constructor-arg>和<property> 標簽的情況下自動裝配相互協(xié)作的 bean 之間的關(guān)系,這有助于減少在Spring配置文件中編寫大量的注入語句。

Spring的自動裝配有三種模式:byType(類型模式),byName(名稱模式)、constructor(構(gòu)造函數(shù)模式)。

在byType模式中,Spring IOC容器會基于反射查看Bean定義的類。當Spring 容器發(fā)現(xiàn)Bean被設置為自動裝配的byType模式后,它會根據(jù)參數(shù)類型在Spring容器中查找與參數(shù)類型相同的被依賴Bean對象,如果已經(jīng)創(chuàng)建,則會把被依賴的對象自動注入到Bean中,如果沒有創(chuàng)建,則不會注入。注入過程需要借助Bean提供的設置方法來完成,否則注入失敗。

在課程案例SpringProgram項目中,EmailNotice類代碼如下:

?

? ? ? ? ? ? ? ? ? ? ?

EmailNotice類依賴于Teacher類,并提供了設置Teacher類的set方法,可以使用Spring的自動裝配機制。配置文件代碼如下:

?

? ? ? ? ? ? ? ? ? ? ?

配置文件通過使用<bean>的autowire屬性啟動名稱為eamilNotice的自動裝配功能。

在byName模式中,Spring IOC容器會根據(jù)定義Bean類的屬性名稱,在Spring容器中查找與Bean類屬性名稱相同的其它Bean名稱進行匹配,如果找到則注入依賴bean。

類似于byName和byType模式,constructor(構(gòu)造函數(shù)模式)適用于構(gòu)造函數(shù)參數(shù)類型,Spring IOC容器會根據(jù)定義Bean類的構(gòu)造函數(shù)給出的參數(shù)類型,在Spring容器中查找與其類型相匹配的其它Bean類,如果找到則注入依賴Bean。

自動裝配最大的問題在于匹配失敗后,Spring容器將不會向Bean注入任何依賴對象,就會導致Bean獲取不到所依賴的對象,當Bean使用該依賴對象時,就會發(fā)生錯誤。因此,在可能的情況下盡可能使用手動裝配。

?

4、基于注解的依賴注入

前面依賴注入都需要在配置文件中手動配置,當需要配置較多Bean類時,需要做大量的手動部署工作,這顯然不妥。在Spring2.5之后,Spring增加了注解方式注入,可以解決較多Bean類依賴注入的問題。

Spring主要提供了@Autowired和@Resource注解模式,下面也重點討論這兩種注解模式。

@Autowired 注解,可以對Bean類成員變量、方法及構(gòu)造函數(shù)進行標注,完成依賴注入的自動裝配工作。使用@Autowired可以省略Bean類的待依賴注入對象的set方法,@Autowired默認情況下按照依賴注入對象的類型自動進行匹配。加入@Autowired注解的方式是在Bean類依賴注入對象的前面加上@Autowired語句。

例如,在課程案例SpringProgram項目中新建發(fā)送通知類QqNotice,QqNotice類依賴Teacher類,在聲明Teacher類變量的前面加上@Autowired語句,代碼如下:

?

? ? ? ? ? ? ? ? ? ? ?

使用注解前必須在Spring配置文件中注冊注解驅(qū)動 <context:annotation-config/>,這樣注解才能被正確識別。

? ? ? ? ? ? ? ? ? ? ?

使用@Autowired注解后,只需要在配置文件中定義Bean就可以了,無需再配置Bean之間的關(guān)聯(lián)關(guān)系。

測試代碼如下:

? ? ? ? ? ? ? ? ? ? ?

@Autowired還提供required的屬性,用來處理當注入的Bean實例不存在的情況。required為true時,如果注入的Bean實例不存在,程序會拋出異常;required為false時,如果注入的Bean實例不存在,程序會忽略。由于默認情況下@Autowired是按類型匹配的(byType),如果需要按名稱(byName)匹配,可以使用@Qualifier注解與@Autowired結(jié)合。

例如,修改QqNotice類,加入@Qualifier注解@Qualifier("teacher"),Spring容器將會在容器中注冊的所有Bean實例中查找名稱為“teacher”的Bean實例并注入,“teacher”為在Spring配置文件中定義Bean類的名稱。

? ? ? ? ? ? ? ? ? ? ?

@Resource注解的功能和@Autowired注解功能相近,@Resource有name和type兩個主要的屬性。Spring容器對于@Resource注解的name屬性解析為bean的名字,type屬性則解析為bean的類型。因此使用name屬性,則按byName模式的自動注入策略,如果使用type屬性則按 byType模式自動注入策略。如果兩個屬性都未指定,Spring容器將通過反射技術(shù)默認按byName模式注入。

例如下面的注解聲明:

? ? ? ? ? ? ? ? ? ? ?

課程小結(jié)

本文介紹了Spring提供的四種依賴注入方式,分別是基于構(gòu)造函數(shù)的依賴注入、基于設置函數(shù)的依賴注入、基于自動裝配的依賴注入、基于注解的依賴注入。

基于構(gòu)造函數(shù)的依賴注入。Bean類依賴外部類時,可以在Bean類內(nèi)部聲明該依賴類,并在提供的構(gòu)造函數(shù)參數(shù)中聲明該類。Spring創(chuàng)建Bean實例時,Spring容器會根據(jù)Bean中指定的構(gòu)造函數(shù)參數(shù)注入外部類。

基于設置函數(shù)的依賴注入。Bean類依賴外部類時,可以在Bean類內(nèi)部聲明該依賴類,并提供該設置該依賴類的set方法。Spring容器會根據(jù)Bean類提供的set方法,將外部依賴類注入到Bean中。

基于自動裝配的依賴注入。該模式自動裝配相互協(xié)作的 bean 之間的關(guān)系,Spring的自動裝配有三種模式:byType(類型模式),byName(名稱模式)、constructor(構(gòu)造函數(shù)模式)。Spring的自動裝配有助于減少在Spring配置文件中編寫大量的注入語句。

基于注解的依賴注入。在Spring2.5之后,Spring增加了注解注入。當Bean類依賴外部類時,只要對Bean類所依賴的類成員變量、方法及構(gòu)造函數(shù)進行標注,Spring即可完成依賴注入的自動裝配工作。

總結(jié)

以上是生活随笔為你收集整理的详解Spring框架的依赖注入的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。