最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring實(shí)現(xiàn)控制反轉(zhuǎn)和依賴注入的示例詳解

 更新時(shí)間:2023年08月13日 09:26:55   作者:小萬(wàn)哥丶  
這篇文章主要為大家詳細(xì)介紹IoC(控制反轉(zhuǎn))和DI(依賴注入)的概念,以及如何在Spring框架中實(shí)現(xiàn)它們,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

什么是控制反轉(zhuǎn)

控制反轉(zhuǎn)是軟件工程中的一個(gè)原則,它將對(duì)象或程序的某些部分的控制權(quán)轉(zhuǎn)移給容器或框架。我們最常在面向?qū)ο缶幊痰纳舷挛闹惺褂盟?/p>

與傳統(tǒng)編程相比,傳統(tǒng)編程中我們的自定義代碼調(diào)用庫(kù),而IoC使框架控制程序的流程并調(diào)用我們的自定義代碼。為了實(shí)現(xiàn)這一點(diǎn),框架使用具有附加行為的抽象。如果我們想要添加自己的行為,我們需要擴(kuò)展框架的類或插入自己的類。

這種架構(gòu)的優(yōu)點(diǎn)是:

  • 將任務(wù)的執(zhí)行與其實(shí)現(xiàn)分離
  • 更容易在不同實(shí)現(xiàn)之間切換
  • 程序的更高的模塊化
  • 更容易通過(guò)隔離組件或模擬其依賴項(xiàng)來(lái)測(cè)試程序,并允許組件通過(guò)契約進(jìn)行通信

我們可以通過(guò)各種機(jī)制實(shí)現(xiàn)IoC,例如:策略設(shè)計(jì)模式、服務(wù)定位器模式、工廠模式和依賴注入(DI)。

什么是依賴注入

依賴注入是一種我們可以用來(lái)實(shí)現(xiàn)IoC的模式,其中被反轉(zhuǎn)的控制是設(shè)置對(duì)象的依賴項(xiàng)。

將對(duì)象與其他對(duì)象連接或?qū)?duì)象“注入”到其他對(duì)象中是由匯編程序而不是對(duì)象本身完成的。

下面是在傳統(tǒng)編程中創(chuàng)建對(duì)象依賴關(guān)系的方法:

public classStore {
private Item item;
public Store() {
        item =newItemImpl1();
    }
}

在上面的示例中,我們需要在*Store類本身中實(shí)例化Item*接口的實(shí)現(xiàn)。

通過(guò)使用DI,我們可以重寫該示例,而不指定我們想要的*Item*的實(shí)現(xiàn):

public classStore {
private Item item;
public Store(Item item) {
        this.item = item;
    }
}

在接下來(lái)的幾節(jié)中,我們將看看如何通過(guò)元數(shù)據(jù)提供Item的實(shí)現(xiàn)。

IoCDI都是簡(jiǎn)單的概念,但它們對(duì)我們構(gòu)建系統(tǒng)的方式有深刻的影響,因此值得充分理解。

Spring IoC容器

IoC容器是實(shí)現(xiàn)IoC的框架的常見特征。

Spring框架中,接口ApplicationContext表示IoC容器。Spring容器負(fù)責(zé)實(shí)例化、配置和組裝稱為bean的對(duì)象,以及管理它們的生命周期。

Spring框架提供了*ApplicationContext

接口的幾個(gè)實(shí)現(xiàn):

ClassPathXmlApplicationContext

FileSystemXmlApplicationContext

用于獨(dú)立應(yīng)用程序,以及

WebApplicationContext*用于Web應(yīng)用程序。

為了組裝bean,容器使用配置元數(shù)據(jù),可以是XML配置或注釋形式。

以下是手動(dòng)實(shí)例化容器的一種方法:

ApplicationContext context=newClassPathXmlApplicationContext("applicationContext.xml");

在上面的示例中,我們可以使用元數(shù)據(jù)設(shè)置*item*屬性,然后容器將讀取此元數(shù)據(jù)并在運(yùn)行時(shí)使用它來(lái)組裝bean。

Spring中,可以通過(guò)構(gòu)造函數(shù)、setter或字段來(lái)進(jìn)行依賴注入。

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

在基于構(gòu)造函數(shù)的依賴注入的情況下,容器將調(diào)用具有表示我們要設(shè)置的依賴項(xiàng)的參數(shù)的構(gòu)造函數(shù)。

Spring通過(guò)類型解決每個(gè)參數(shù),然后按屬性名稱和索引進(jìn)行消歧。讓我們看看使用注釋配置bean及其依賴項(xiàng)的配置:

@Configuration
public class AppConfig {
@Bean
public Itemitem1() {
return new ItemImpl1();
    }
@Bean
public Storestore() {
return new Store(item1());
    }
}

*@Configuration*注釋表示該類是bean定義的源。我們也可以將其添加到多個(gè)配置類中。

我們?cè)诜椒ㄉ鲜褂?code>@Bean注釋來(lái)定義bean。如果我們沒(méi)有指定自定義名稱,則bean名稱將默認(rèn)為方法名稱。

對(duì)于默認(rèn)的*singleton

范圍的beanSpring首先檢查是否已存在緩存的bean實(shí)例,僅在不存在時(shí)創(chuàng)建新實(shí)例。如果我們使用prototype*范圍,則容器為每個(gè)方法調(diào)用返回一個(gè)新的bean實(shí)例。

創(chuàng)建bean的另一種方式是通過(guò)XML配置:

<bean id="item1" class="org.baeldung.store.ItemImpl1" />
<bean id="store" class="org.baeldung.store.Store">
    <constructor-arg type="ItemImpl1" index="0" name="item" ref="item1" />
</bean>

基于setter的依賴注入

對(duì)于基于setterDI,容器將在調(diào)用沒(méi)有參數(shù)的構(gòu)造函數(shù)或沒(méi)有參數(shù)的靜態(tài)工廠方法來(lái)實(shí)例化bean之后調(diào)用我們類的setter方法。讓我們使用注釋創(chuàng)建此配置:

@Bean
public Storestore() {
Store store =newStore();
    store.setItem(item1());
return store;
}

我們也可以使用XML進(jìn)行相同的bean配置:

<bean id="store" class="org.baeldung.store.Store">
    <property name="item" ref="item1" />
</bean>

我們可以將構(gòu)造函數(shù)和setter類型的注入結(jié)合在同一個(gè)bean中。Spring文檔建議將基于構(gòu)造函數(shù)的注入用于必需的依賴項(xiàng),將基于setter的注入用于可選的依賴項(xiàng)。

基于字段的依賴注入

在基于字段的DI的情況下,我們可以通過(guò)帶有@Autowired注釋的注釋將依賴項(xiàng)注入其中:

public class Store {
    @Autowired
private Item item;
}

在構(gòu)造*Store

對(duì)象時(shí),如果沒(méi)有構(gòu)造函數(shù)或setter方法將Itembean注入其中,容器將使用反射將Item注入Store*中。

我們也可以使用XML來(lái)實(shí)現(xiàn)這一點(diǎn)。

這種方法可能看起來(lái)更簡(jiǎn)單、更清晰,但我們不建議使用它,因?yàn)樗幸恍┤秉c(diǎn),例如:

  • 此方法使用反射來(lái)注入依賴項(xiàng),這比基于構(gòu)造函數(shù)或setter的注入更昂貴。
  • 使用此方法很容易添加多個(gè)依賴項(xiàng)。如果我們使用構(gòu)造函數(shù)注入,有多個(gè)參數(shù)會(huì)讓我們認(rèn)為這個(gè)類做了不止一件事,這可能違反單一責(zé)任原則。

自動(dòng)裝配依賴項(xiàng)

自動(dòng)裝配允許Spring容器通過(guò)檢查已定義的bean來(lái)自動(dòng)解決協(xié)作bean之間的依賴關(guān)系。

使用XML配置有四種自動(dòng)裝配bean的模式:

  • no:默認(rèn)值 - 這意味著不使用自動(dòng)裝配,我們必須顯式地命名依賴項(xiàng)。
  • byName:按屬性名稱進(jìn)行自動(dòng)裝配,因此Spring將查找與需要設(shè)置的屬性同名的bean。
  • byType:類似于按名稱進(jìn)行自動(dòng)裝配,僅基于屬性的類型。這意味著Spring將查找具有相同類型的屬性來(lái)設(shè)置的bean。如果有多個(gè)bean具有該類型,則框架會(huì)拋出異常。
  • constructor:基于構(gòu)造函數(shù)參數(shù)進(jìn)行自動(dòng)裝配,意味著Spring將查找具有與構(gòu)造函數(shù)參數(shù)相同類型的bean

例如,讓我們通過(guò)類型創(chuàng)建具有依賴項(xiàng)*itemstore*bean

public class AppConfig {
    @Bean
    public Item item() {
        return new ItemImpl1();
    }
    @Bean(autowire = Autowire.BY_TYPE)
    public Store store() {
        return new Store();
    }
}

請(qǐng)注意,自Spring 5.1起,*autowire*屬性已棄用。

我們還可以使用@Autowired注釋按類型注入bean

public class Store {
    @Autowired
    private Item item;
}

如果存在相同類型的多個(gè)bean,則可以使用@Qualifier注釋按名稱引用bean

public class Store {
    @Autowired
    @Qualifier("item1")
    private Item item;
}

現(xiàn)在,讓我們通過(guò)XML配置按類型自動(dòng)裝配bean

<bean id="store" class="org.baeldung.store.Store" autowire="byType"> </bean>

接下來(lái),讓我們通過(guò)XML按名稱將名為*itembean注入到storebean的item*屬性中:

<bean id="item" class="org.baeldung.store.ItemImpl1" />
<bean id="store" class="org.baeldung.store.Store" autowire="byName">
</bean>

我們還可以通過(guò)構(gòu)造函數(shù)參數(shù)或setter顯式定義依賴關(guān)系來(lái)覆蓋自動(dòng)裝配。

惰性初始化的bean

默認(rèn)情況下,容器在初始化期間創(chuàng)建和配置所有單例bean。為了避免這種情況,我們可以在bean配置上使用值為*truelazy-init*屬性:

<bean id="item1" class="org.baeldung.store.ItemImpl1" lazy-init="true" />

因此,只有在第一次請(qǐng)求它時(shí),才會(huì)初始化*item1*bean,而不是在啟動(dòng)時(shí)。這樣做的優(yōu)點(diǎn)是初始化時(shí)間更快,但缺點(diǎn)是我們?cè)?code>bean被請(qǐng)求之后才會(huì)發(fā)現(xiàn)任何配置錯(cuò)誤,這可能是應(yīng)用程序已運(yùn)行數(shù)小時(shí)甚至數(shù)天之后。

到此這篇關(guān)于Spring實(shí)現(xiàn)控制反轉(zhuǎn)和依賴注入的示例詳解的文章就介紹到這了,更多相關(guān)Spring控制反轉(zhuǎn) 依賴注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Java 中的單元測(cè)試

    淺談Java 中的單元測(cè)試

    這篇文章主要介紹了Java 中的單元測(cè)試的相關(guān)資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • Java元注解meta-annotation和依賴注入詳解

    Java元注解meta-annotation和依賴注入詳解

    這篇文章主要給大家介紹了關(guān)于Java元注解meta-annotation和依賴注入的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • springboot整合mybatis將sql打印到日志的實(shí)例詳解

    springboot整合mybatis將sql打印到日志的實(shí)例詳解

    這篇文章主要介紹了springboot整合mybatis將sql打印到日志的實(shí)例詳解,需要的朋友可以參考下
    2017-12-12
  • IntelliJ?IDEA導(dǎo)出WAR包詳細(xì)過(guò)程

    IntelliJ?IDEA導(dǎo)出WAR包詳細(xì)過(guò)程

    這篇文章主要介紹了IntelliJ?IDEA導(dǎo)出WAR包全指南,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2026-01-01
  • JAVA內(nèi)存區(qū)域示例詳解

    JAVA內(nèi)存區(qū)域示例詳解

    Java內(nèi)存區(qū)域包括程序計(jì)數(shù)器、虛擬機(jī)棧、本地方法棧、堆、元空間和直接內(nèi)存,分別用于線程私有數(shù)據(jù)和線程共享數(shù)據(jù),理解這些區(qū)域有助于定位內(nèi)存問(wèn)題、優(yōu)化JVM性能和編寫高性能代碼,本文介紹java內(nèi)存區(qū)域的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2025-12-12
  • SpringBoot實(shí)現(xiàn)讀取YML,yaml,properties文件

    SpringBoot實(shí)現(xiàn)讀取YML,yaml,properties文件

    yml,yaml,properties三種文件都是用來(lái)存放配置的文件,一些靜態(tài)數(shù)據(jù),配置的數(shù)據(jù)都會(huì)存放到里邊。本文主要為大家整理了SpringBoot實(shí)現(xiàn)讀取YML,yaml,properties文件的方法,需要的可以參考一下
    2023-04-04
  • springboot如何配置Filter過(guò)濾器

    springboot如何配置Filter過(guò)濾器

    這篇文章主要介紹了springboot如何配置Filter過(guò)濾器問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 解決mybatis 數(shù)據(jù)庫(kù)date 與 java中Date類型映射問(wèn)題

    解決mybatis 數(shù)據(jù)庫(kù)date 與 java中Date類型映射問(wèn)題

    這篇文章主要介紹了解決mybatis 數(shù)據(jù)庫(kù)date 與 java中Date類型映射問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)吧
    2020-11-11
  • idea?maven?經(jīng)常主目錄自動(dòng)變回默認(rèn)的解決方法

    idea?maven?經(jīng)常主目錄自動(dòng)變回默認(rèn)的解決方法

    很多朋友反映idea?maven?經(jīng)常主目錄自動(dòng)變回默認(rèn),遇到這樣的問(wèn)題真的很頭疼,該如何解決呢?下面小編給大家介紹下idea?maven目錄變回默認(rèn)的解決方法,需要的朋友可以參考下
    2022-08-08
  • 如何用Java設(shè)計(jì)一個(gè)隨機(jī)驗(yàn)證碼生成器

    如何用Java設(shè)計(jì)一個(gè)隨機(jī)驗(yàn)證碼生成器

    在信息技術(shù)領(lǐng)域,驗(yàn)證碼是一種常見的安全機(jī)制,用于防止自動(dòng)化的機(jī)器人程序或惡意攻擊者進(jìn)行非法操作,這篇文章主要介紹了如何用Java設(shè)計(jì)一個(gè)隨機(jī)驗(yàn)證碼生成器的相關(guān)資料,需要的朋友可以參考下
    2026-01-01

最新評(píng)論

瑞安市| 区。| 曲麻莱县| 东方市| 石柱| 海伦市| 利津县| 西藏| 中牟县| 锡林浩特市| 平谷区| 浦江县| 余姚市| 元氏县| 鄂州市| 花莲市| 钟山县| 丹阳市| 阿尔山市| 江北区| 鄂托克前旗| 陵水| 格尔木市| 增城市| 扶绥县| 巴青县| 城固县| 大关县| 梁平县| 新丰县| 融水| 汶上县| 淮阳县| 武义县| 昌都县| 安图县| 竹山县| 开江县| 句容市| 万年县| 新乡市|