国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用 Spring 實(shí)現(xiàn)控制反轉(zhuǎn)和依賴注入

這篇具有很好參考價(jià)值的文章主要介紹了使用 Spring 實(shí)現(xiàn)控制反轉(zhuǎn)和依賴注入。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

概述

在本文中,我們將介紹IoC(控制反轉(zhuǎn))和DI(依賴注入)的概念,以及如何在Spring框架中實(shí)現(xiàn)它們。

什么是控制反轉(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)之間切換
  • 程序的更高的模塊化
  • 更容易通過隔離組件或模擬其依賴項(xiàng)來測(cè)試程序,并允許組件通過契約進(jìn)行通信

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

什么是依賴注入?

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

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

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

publicclassStore {
private Item item;

publicStore() {
        item =newItemImpl1();
    }
}Copy

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

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

publicclassStore {
private Item item;
publicStore(Item item) {
        this.item = item;
    }
}Copy

在接下來的幾節(jié)中,我們將看看如何通過元數(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):ClassPathXmlApplicationContextFileSystemXmlApplicationContext用于獨(dú)立應(yīng)用程序,以及WebApplicationContext用于Web應(yīng)用程序。

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

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

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

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

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

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

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

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

@Configuration
publicclassAppConfig {

    @Bean
public Itemitem1() {
returnnewItemImpl1();
    }

    @Bean
public Storestore() {
returnnewStore(item1());
    }
}Copy

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

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

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

創(chuàng)建bean的另一種方式是通過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>Copy

基于setter的依賴注入

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

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

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

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

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

基于字段的依賴注入

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

publicclassStore {
    @Autowired
private Item item;
}Copy

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

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

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

  • 此方法使用反射來注入依賴項(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容器通過檢查已定義的bean來自動(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將查找具有相同類型的屬性來設(shè)置的bean。如果有多個(gè)bean具有該類型,則框架會(huì)拋出異常。
  • constructor:基于構(gòu)造函數(shù)參數(shù)進(jìn)行自動(dòng)裝配,意味著Spring將查找具有與構(gòu)造函數(shù)參數(shù)相同類型的bean。

例如,讓我們通過類型創(chuàng)建具有依賴項(xiàng)itemstorebean。

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)在,讓我們通過XML配置按類型自動(dòng)裝配bean

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

接下來,讓我們通過XML按名稱將名為itembean注入到storebeanitem屬性中:

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

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

我們還可以通過構(gòu)造函數(shù)參數(shù)或setter顯式定義依賴關(guān)系來覆蓋自動(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ì)初始化item1bean,而不是在啟動(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ù)天之后。

結(jié)論

在本文中,我們介紹了控制反轉(zhuǎn)和依賴注入的概念,并在Spring框架中進(jìn)行了示例。

最后

為了方便其他設(shè)備和平臺(tái)的小伙伴觀看往期文章,鏈接奉上:

公眾號(hào)搜索Let us Coding知乎,開源中國(guó),CSDN,思否,掘金,InfoQ,簡(jiǎn)書博客園,慕課,51CTO,helloworld,騰訊開發(fā)者社區(qū)阿里開發(fā)者社區(qū)

看完如果覺得有幫助,歡迎點(diǎn)贊、收藏關(guān)注文章來源地址http://www.zghlxwxcb.cn/news/detail-641039.html

到了這里,關(guān)于使用 Spring 實(shí)現(xiàn)控制反轉(zhuǎn)和依賴注入的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 深入理解 Spring IoC 和 DI:掌握控制反轉(zhuǎn)和依賴注入的精髓

    在本文中,我們將介紹 IoC (控制反轉(zhuǎn))和 DI (依賴注入)的概念,以及如何在 Spring 框架中實(shí)現(xiàn)它們。 控制反轉(zhuǎn)是軟件工程中的一個(gè)原則,它將對(duì)象或程序的某些部分的控制權(quán)轉(zhuǎn)移給容器或框架。我們最常在面向?qū)ο缶幊痰纳舷挛闹惺褂盟?與傳統(tǒng)編程相比,傳統(tǒng)編程中我

    2024年02月04日
    瀏覽(29)
  • .NET使用依賴注入,控制反轉(zhuǎn)

    .NET 支持依賴項(xiàng)注入 (DI) 軟件設(shè)計(jì)模式,這是一種在類及其依賴項(xiàng)之間實(shí)現(xiàn) 控制 (IoC) 的反轉(zhuǎn) 的技術(shù) 避免有狀態(tài)的、靜態(tài)類和成員。 通過將應(yīng)用設(shè)計(jì)為改用單一實(shí)例服務(wù),避免創(chuàng)建全局狀態(tài)。 避免在服務(wù)中直接實(shí)例化依賴類。 直接實(shí)例化會(huì)將代碼耦合到特定實(shí)現(xiàn)。 不在服務(wù)

    2023年04月16日
    瀏覽(28)
  • Spring5學(xué)習(xí)隨筆-IOC(反轉(zhuǎn)控制)、DI(依賴注入)和創(chuàng)建復(fù)雜對(duì)象

    Spring5學(xué)習(xí)隨筆-IOC(反轉(zhuǎn)控制)、DI(依賴注入)和創(chuàng)建復(fù)雜對(duì)象

    學(xué)習(xí)視頻:【孫哥說Spring5:從設(shè)計(jì)模式到基本應(yīng)用到應(yīng)用級(jí)底層分析,一次深入淺出的Spring全探索。學(xué)不會(huì)Spring?只因你未遇見孫哥】 控制:對(duì)于成員變量賦值的控制權(quán) 反轉(zhuǎn)控制:把對(duì)于成員變量賦值的控制權(quán),從代碼中反轉(zhuǎn)(轉(zhuǎn)移)到Spring工廠和配置文件中。 好處:解耦合

    2024年02月05日
    瀏覽(55)
  • Spring入門&控制反轉(zhuǎn)(或依賴注入)&AOP的關(guān)鍵概念& 多配置文件&與web集成

    目錄 1. 什么是spring,它能夠做什么? 2. 什么是控制反轉(zhuǎn)(或依賴注入) 3. AOP的關(guān)鍵概念 4. 示例 4.1 創(chuàng)建工程 4.2 pom文件 4.3 spring配置文件 4.4 示例代碼 4.4.1 示例1 4.4.2 示例2 (abstract,parent示例) 4.4.3 使用有參數(shù)構(gòu)造方法創(chuàng)建javaBean 4.4.4 init-method:指定bean的初始化方法 4.4.5 復(fù)雜屬

    2024年02月09日
    瀏覽(24)
  • 【Spring進(jìn)階系列丨第二篇】Spring中的兩大核心技術(shù)IoC(控制反轉(zhuǎn))與DI(依賴注入)

    【Spring進(jìn)階系列丨第二篇】Spring中的兩大核心技術(shù)IoC(控制反轉(zhuǎn))與DI(依賴注入)

    我們都知道Spring 框架主要的優(yōu)勢(shì)是在 簡(jiǎn)化開發(fā) 和 框架整合 上,至于如何實(shí)現(xiàn)就是我們要學(xué)習(xí)Spring 框架的主要內(nèi)容,今天我們就來一起學(xué)習(xí)Spring中的兩大核心技術(shù)IoC(控制反轉(zhuǎn))與DI(依賴注入)。 以經(jīng)典的三層架構(gòu)MVC作為案例,以前我們都是這么干的,看如下代碼: 按照

    2024年02月05日
    瀏覽(34)
  • Springboot 入門指南:控制反轉(zhuǎn)和依賴注入的含義和實(shí)現(xiàn)方式

    目錄 一、什么是控制反轉(zhuǎn)(IoC)? 二、什么是依賴注入(DI)? 三、如何在 springboot 中使用 IoC 和 DI? 總結(jié) 控制反轉(zhuǎn)(Inversion of Control,簡(jiǎn)稱 IoC)是一種設(shè)計(jì)原則,它的目的是降低代碼之間的耦合度,提高模塊化和可測(cè)試性??刂品崔D(zhuǎn)的含義是,將對(duì)象的創(chuàng)建、配置和管理

    2024年02月11日
    瀏覽(29)
  • Java Spring IoC&DI :探索Java Spring中控制反轉(zhuǎn)和依賴注入的威力,增強(qiáng)靈活性和可維護(hù)性

    Java Spring IoC&DI :探索Java Spring中控制反轉(zhuǎn)和依賴注入的威力,增強(qiáng)靈活性和可維護(hù)性

    ?? 博客主頁(yè):從零開始的-CodeNinja之路 ? 收錄文章:Java Spring IoCDI :探索Java Spring中控制反轉(zhuǎn)和依賴注入的威力,增強(qiáng)靈活性和可維護(hù)性 ??歡迎大家點(diǎn)贊??評(píng)論??收藏?文章 我們一下要學(xué)習(xí)的內(nèi)容都是為了實(shí)現(xiàn)?內(nèi)聚低耦合來進(jìn)行的 軟件設(shè)計(jì)原則:?內(nèi)聚低耦合. ?內(nèi)聚指

    2024年04月15日
    瀏覽(23)
  • PHP依賴注入 與 控制反轉(zhuǎn)詳解

    PHP依賴注入 與 控制反轉(zhuǎn)詳解

    ? 依賴注入 是一種設(shè)計(jì)模式,用于解耦組件之間的依賴關(guān)系。 它的主要思想是通過 將依賴的對(duì)象傳遞給調(diào)用方 ,而 不是由調(diào)用方自己創(chuàng)建或管理依賴的對(duì)象 。這種方式使得組件的依賴關(guān)系更加靈活,易于維護(hù)和測(cè)試。 控制反轉(zhuǎn) 是一個(gè)更廣泛的概念,它與依賴注入緊密相

    2024年02月06日
    瀏覽(24)
  • 深入理解WPF中的依賴注入和控制反轉(zhuǎn)

    深入理解WPF中的依賴注入和控制反轉(zhuǎn)

    在WPF開發(fā)中, 依賴注入(Dependency Injection)和控制反轉(zhuǎn)(Inversion of Control)是程序解耦的關(guān)鍵,在當(dāng)今軟件工程中占有舉足輕重的地位,兩者之間有著密不可分的聯(lián)系 。今天就以一個(gè)簡(jiǎn)單的小例子,簡(jiǎn)述如何在WPF中實(shí)現(xiàn)依賴注入和控制反轉(zhuǎn),僅供學(xué)習(xí)分享使用,如有不足之處

    2024年02月06日
    瀏覽(21)
  • 6.3Java EE——控制反轉(zhuǎn)與依賴注入

    一、控制反轉(zhuǎn)的概念 傳統(tǒng)面向?qū)ο蟪绦蛟O(shè)計(jì)原則 ????????控制反轉(zhuǎn)(Inversion of Control,縮寫為IoC)是面向?qū)ο缶幊讨械囊粋€(gè)設(shè)計(jì)原則,用來降低程序代碼之間的耦合度。在傳統(tǒng)面向?qū)ο缶幊讨?,獲取對(duì)象的方式是用new主動(dòng)創(chuàng)建一個(gè)對(duì)象,也就是說應(yīng)用程序掌握著對(duì)

    2024年02月16日
    瀏覽(38)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包