欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring依賴注入Dependency Injection的三種方式

 更新時間:2023年02月14日 09:23:06   作者:每天都要進(jìn)步一點點  
依賴注入(Dependency Injection)和控制反轉(zhuǎn)(Inversion of Control)是同一個概念。具體含義是:當(dāng)某個角色(可能是一個Java實例,調(diào)用者)需要另一個角色(另一個Java實例,被調(diào)用者)的協(xié)助時,在傳統(tǒng)的程序設(shè)計過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實例

Spring的依賴注入,我們一般使用@Autowired注解來完成,關(guān)于依賴注入一般有三種方式:

變量注入、構(gòu)造器注入、setter方法注入,下面我們仔細(xì)分析一下三種注入方式各自的特點以及使用場景。

一、變量注入(Field Injection)

先看看怎么使用:

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    //...
}

使用IDEA開發(fā)的時候,我們發(fā)現(xiàn)直接在變量上注解 @Autowired,它會有個警告提示:Field injection is not recommended。如下圖:

具體是:Field injection is not recommended

Inspection info: Spring Team recommends: "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies"。

意思是說“變量依賴注入是不被建議的方式”。Spring官方建議“總是采用構(gòu)造器注入的方式建立依賴注入”。

優(yōu)點:

  • 注入方式簡單,非常簡潔,沒有任何多余代碼;

弊端:

  • 注入對象不能用final修飾;
  • 可能會導(dǎo)致循環(huán)依賴,啟動的時候不會報錯,在使用那個bean的時候才會報錯;
  • 對于IOC容器以外的環(huán)境,除了使用反射來提供它需要的依賴之外,無法復(fù)用該實現(xiàn)類。而且將一直是個潛在的隱患,因為你不調(diào)用將一直無法發(fā)現(xiàn)NullPointException的存在;

二、構(gòu)造器注入(Constructor Injection)

先看看怎么使用:

@Service
public class UserServiceImpl implements UserService {
    private final UserMapper userMapper;
    @Autowired
    public UserServiceImpl(UserMapper userMapper) {
        this.userMapper = userMapper;
    }
}

優(yōu)點:

  • 顯式注明必須強(qiáng)制注入,通過強(qiáng)制指明依賴注入來保證這個類的運(yùn)行,防止NullPointerException;
  • 注入對象可以使用final修飾;
  • 非IOC容器環(huán)境也可使用new實例化該類的對象;
  • 避免循環(huán)依賴,如果存在循環(huán)依賴,spring項目啟動的時候就會報錯;

弊端:

  • 當(dāng)你有十幾個甚至更多對象需要注入時,構(gòu)造函數(shù)的代碼臃腫,看起來不太舒服;

使用 IEDA 可以在修改變量后重新使用快捷鍵生成構(gòu)造方法。

三、setter方法注入(Setter Injection)

先看看怎么使用:

@Service
public class UserServiceImpl implements UserService {
    private UserMapper userMapper;
    @Autowired
    public void setUserMapper(UserMapper userMapper) {
        this.userMapper = userMapper;
    }
}

優(yōu)點:

  • 依賴注入中使用的依賴是可選的,選擇依賴的意思是注入的依賴是可以為 NULL;
  • 允許在類構(gòu)造完成后重新注入;

弊端:

  • 注入對象不能使用final修飾;

四、使用場景

  • 如果注入的屬性是必選的屬性,則通過構(gòu)造器注入;
  • 如果注入的屬性是可選的屬性,則通過setter方法注入;
  • 至于field注入,不建議使用;

到此這篇關(guān)于Spring依賴注入Dependency Injection的三種方式的文章就介紹到這了,更多相關(guān)Spring依賴注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入了解為什么Java中只有值傳遞?

    深入了解為什么Java中只有值傳遞?

    這篇文章主要介紹了為什么 Java 中只有值傳遞?下面我們來簡單了解一下吧
    2019-05-05
  • java語言自行實現(xiàn)ULID過程底層原理詳解

    java語言自行實現(xiàn)ULID過程底層原理詳解

    這篇文章主要為大家介紹了java語言自行實現(xiàn)ULID過程底層原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 新版SpringSecurity5.x使用與配置詳解

    新版SpringSecurity5.x使用與配置詳解

    Spring Security是一個強(qiáng)大且高度可定制的身份驗證和訪問控制框架,本文主要介紹了新版SpringSecurity5.x使用與配置詳解,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • Java 數(shù)組獲取最大和最小值的實例實現(xiàn)

    Java 數(shù)組獲取最大和最小值的實例實現(xiàn)

    這篇文章主要介紹了Java 數(shù)組獲取最大和最小值的實例實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • SpringBoot 動態(tài)定時器的使用方法

    SpringBoot 動態(tài)定時器的使用方法

    這篇文章主要介紹了SpringBoot 動態(tài)定時器的使用方法,非常不錯,具有一定的參考借鑒借鑒價值,需要的朋友可以參考下
    2018-05-05
  • Java的動態(tài)代理模式之Cglib代理詳解

    Java的動態(tài)代理模式之Cglib代理詳解

    這篇文章主要介紹了Java的動態(tài)代理模式之Cglib代理詳解,Cglib代理也叫作?子類代理,它是在內(nèi)存中構(gòu)建一個子類對象從而實現(xiàn)對目標(biāo)對象功能擴(kuò)展,?有些書也將Cglib代理歸屬到動態(tài)代理,需要的朋友可以參考下
    2023-11-11
  • Java躲不過設(shè)計模式的坑之代理模式詳解

    Java躲不過設(shè)計模式的坑之代理模式詳解

    設(shè)計模式看來更像是一種設(shè)計思維或設(shè)計思想,為你的項目工程提供方向,讓你的項目工程更加健壯、靈活,延續(xù)生命力。本文即將分享的是設(shè)計模式的其中一種:代理模式,感興趣的可以了解一下
    2022-09-09
  • java中File轉(zhuǎn)為MultipartFile的四種實現(xiàn)方式

    java中File轉(zhuǎn)為MultipartFile的四種實現(xiàn)方式

    這篇文章主要介紹了java中File轉(zhuǎn)為MultipartFile的四種實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • java中的stream流中的并行查詢java

    java中的stream流中的并行查詢java

    Stream流是Java 8引入的一種新的數(shù)據(jù)處理方式,它提供了一種高效、簡潔的數(shù)據(jù)處理方式,Stream流可以讓我們以聲明式的方式處理數(shù)據(jù),提高了代碼的可讀性和可維護(hù)性,同時,Stream流支持并行處理,可以充分利用多核CPU的性能,提高程序的運(yùn)行效率
    2024-07-07
  • 深入淺出理解Java Lambda表達(dá)式之四大核心函數(shù)式的用法與范例

    深入淺出理解Java Lambda表達(dá)式之四大核心函數(shù)式的用法與范例

    Lambda 表達(dá)式,也可稱為閉包,它是推動 Java 8 發(fā)布的最重要新特性。Lambda 允許把函數(shù)作為一個方法的參數(shù)(函數(shù)作為參數(shù)傳遞進(jìn)方法中)。使用 Lambda 表達(dá)式可以使代碼變的更加簡潔緊湊,今天小編帶你理解Lambda表達(dá)式之四大核心函數(shù)式的用法,感興趣的朋友快來看看吧
    2021-11-11

最新評論