亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

概述

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

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

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

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

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

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

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

什么是依賴注入?

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

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

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

ini復(fù)制代碼publicclassStore {
private Item item;

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

在上面的示例中,我們需要在*Store

類本身中實例化

Item*接口的實現(xiàn)。

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

ini復(fù)制代碼publicclassStore {
private Item item;
publicStore(Item item) {
        this.item = item;
    }
}Copy

在接下來的幾節(jié)中,我們將看看如何通過元數(shù)據(jù)提供

Item

的實現(xiàn)。

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

Spring IoC容器

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

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

Spring框架提供了*ApplicationContext

接口的幾個實現(xiàn):

ClassPathXmlApplicationContext

FileSystemXmlApplicationContext

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

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

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

以下是手動實例化容器的一種方法:

ini復(fù)制代碼ApplicationContext context
  =newClassPathXmlApplicationContext("applicationContext.xml");Copy

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

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

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

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

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

scss復(fù)制代碼@Configuration
publicclassAppConfig {

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

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

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

我們在方法上使用@Bean注釋來定義bean。如果我們沒有指定自定義名稱,則bean名稱將默認為方法名稱。

對于默認的*singleton

范圍的bean,Spring首先檢查是否已存在緩存的bean實例,僅在不存在時創(chuàng)建新實例。如果我們使用

prototype*范圍,則容器為每個方法調(diào)用返回一個新的bean實例。

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

ini復(fù)制代碼<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的依賴注入

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

ini復(fù)制代碼@Bean
public Storestore() {
Store store =newStore();
    store.setItem(item1());
return store;
}Copy

我們也可以使用XML進行相同的bean配置:

ini復(fù)制代碼<bean id="store" class="org.baeldung.store.Store">
    <property name="item" ref="item1" />
</bean>Copy

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

基于字段的依賴注入

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

JAVA復(fù)制代碼publicclassStore {
    @Autowired
private Item item;
}Copy

在構(gòu)造*Store

對象時,如果沒有構(gòu)造函數(shù)或setter方法將

Item

bean注入其中,容器將使用反射將

Item

注入

Store*中。

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

這種方法可能看起來更簡單、更清晰,但我們不建議使用它,因為它有一些缺點,例如:

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

自動裝配依賴項

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

使用XML配置有四種自動裝配bean的模式:

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

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

store*bean。

typescript復(fù)制代碼public class AppConfig {
    @Bean
    public Item item() {
        return new ItemImpl1();
    }

    @Bean(autowire = Autowire.BY_TYPE)
    public Store store() {
        return new Store();
    }
}

請注意,自Spring 5.1起,*autowire*屬性已棄用。

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

kotlin復(fù)制代碼public class Store {

    @Autowired
    private Item item;
}

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

less復(fù)制代碼public class Store {

    @Autowired
    @Qualifier("item1")
    private Item item;
}

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

bash復(fù)制代碼<bean id="store" class="org.baeldung.store.Store" autowire="byType"> </bean>

接下來,讓我們通過XML按名稱將名為*item

的bean注入到

store

bean的

item*屬性中:

ini復(fù)制代碼<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)系來覆蓋自動裝配。

惰性初始化的bean

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

lazy-init*屬性:

csharp復(fù)制代碼<bean id="item1" class="org.baeldung.store.ItemImpl1" lazy-init="true" />

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

結(jié)論

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

分享到:
標簽:Spring
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定