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

Spring依賴注入DI之三種依賴注入類型詳解

 更新時間:2023年09月13日 09:04:27   作者:黃泥川水猴子  
這篇文章主要介紹了Spring依賴注入DI之三種依賴注入類型詳解,通過 @Autowired 注解,字段注入的實現(xiàn)方式非常簡單而直接,代碼的可讀性也很強,事實上,字段注入是三種注入方式中最常用、也是最容易使用的一種,需要的朋友可以參考下

 Spring依賴注入

在這里插入圖片描述

字段注入

首先,我們可以使用字段注入。想要在一個類中通過字段的形式注入某個對象,可以采用這樣的方式:

public class ClientService { 
    @Autowired 
    private HealthRecordService healthRecordService; 
    public void recordUserHealthData() { 
        healthRecordService.recordUserHealthData(); 
    } 
}

可以看到,通過 @Autowired 注解,字段注入的實現(xiàn)方式非常簡單而直接,代碼的可讀性也很強。事實上,字段注入是三種注入方式中最常用、也是最容易使用的一種。但它也是三種注入方式中最應(yīng)該避免使用的。就像開篇說的,我們在 IDEA 中使用字段注入時會遇到“Field injection is not recommended”的提示。你知道為什么嗎?原因有三點。

問題一、

字段注入的最大問題是對象的外部可見性。在前面的 ClientService 類中,我們通過定義一個私有變量 HealthRecordService 來注入該接口的實例。顯然,這個實例只能在 ClientService 類中被訪問,脫離了容器環(huán)境我們無法訪問這個實例,來看下面這段代碼:

ClientService clientService = new ClientService(); 
clientService.recordUserHealthData (); 

執(zhí)行這段代碼的結(jié)果就是拋出一個 NullPointerException 空指針異常,原因就在于無法在 ClientService 的外部實例化 HealthRecordService 對象。采用字段注入,類與容器的耦合度過高,我們無法脫離容器來使用目標(biāo)對象。如果編寫測試用例來驗證 ClientService 類的正確性,那么想要使用 HealthRecordService 對象,就只能使用反射的方式,這種做法實際上是不符合 JavaBean 開發(fā)規(guī)范的,而且可能一直無法發(fā)現(xiàn)空指針異常的存在。

問題二、

我們無法設(shè)置需要注入的對象為 final,也無法注入那些不可變對象,final類型的變量在調(diào)用class的構(gòu)造函數(shù)的這個過程當(dāng)中就得初始化完成,這個是基于字段的依賴注入做不到的地方,只能使用基于構(gòu)造函數(shù)的依賴注入的方式.

問題三、

字段注入的第三個問題是可能導(dǎo)致潛在的循環(huán)依賴,即兩個類之間互相進(jìn)行注入,例如下面這段示例代碼:

public class ClassA { 
    @Autowired 
    private ClassB classB; 
} 
public class ClassB { 
    @Autowired 
    private ClassA classA; 
} 

這里的 ClassA 和 ClassB 發(fā)生了循環(huán)依賴。上述代碼在 Spring 中是合法的,容器啟動時并不會報任何錯誤,而只有在使用到具體某個 ClassA 或 ClassB 時才會報錯。

問題四、

無法對注入的屬性進(jìn)行安全檢查 在程序啟動的時候無法拿到這個類,只有在真正的業(yè)務(wù)使用的時候才會拿到,若注入的是null,因為不調(diào)用將一直無法發(fā)NullPointException的存在。 或者想在屬性注入的時候,增加驗證措施,也無法辦到。

基于以上四點,無論是 IDEA,還是 Spring 官方,都不推薦開發(fā)人員使用字段注入這種注入模式,而是推薦構(gòu)造器注入。

在面試中,針對字段注入,請記住它主要的三點缺陷:不具備外部可見性、會導(dǎo)致循環(huán)依賴,以及無法注入不可變對象。

構(gòu)造器注入

@Controller
@RequestMapping("employee")
public class EmployeeController {
    private final EmployeeMapper employeeMapper;
    @Autowired
    public EmployeeController(EmployeeMapper employeeMapper) {
        this.employeeMapper = employeeMapper;
    }
}

優(yōu)點:

  • 保證依賴不可變(final關(guān)鍵字)。
  • 保證依賴不為空(省去了我們對其檢查)。
  • 保證返回客戶端(調(diào)用)的代碼的時候是完全初始化的狀態(tài)。
  • 避免了循環(huán)依賴。
  • 提升了代碼的可復(fù)用性。
  • 可以明確成員變量的注入順序。

缺點:

  • 當(dāng)注入?yún)?shù)較多時,代碼臃腫。

set方法注入

@Controller
@RequestMapping("employee")
public class EmployeeController {
    private EmployeeMapper employeeMapper;
    @Autowired
    public void setEmployeeMapper(EmployeeMapper employeeMapper) {
        this.employeeMapper = employeeMapper;
    }
}

優(yōu)點:

  • 相比構(gòu)造器注入,set注入類似于選擇性注入。
  • 允許在類構(gòu)造完成后重新注入。

缺點: 暫無

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

相關(guān)文章

  • 細(xì)品Java8中hashCode方法的使用

    細(xì)品Java8中hashCode方法的使用

    這篇文章主要介紹了細(xì)品Java8中hashCode方法的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Spring請求參數(shù)校驗功能實例演示

    Spring請求參數(shù)校驗功能實例演示

    這篇文章主要介紹了Spring請求參數(shù)校驗功能實例演示,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-05-05
  • springsecurity實現(xiàn)用戶登錄認(rèn)證快速使用示例代碼(前后端分離項目)

    springsecurity實現(xiàn)用戶登錄認(rèn)證快速使用示例代碼(前后端分離項目)

    這篇文章主要介紹了springsecurity實現(xiàn)用戶登錄認(rèn)證快速使用示例代碼(前后端分離項目),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-03-03
  • JAVA超級簡單的爬蟲實例講解

    JAVA超級簡單的爬蟲實例講解

    下面小編就為大家?guī)硪黄狫AVA超級簡單的爬蟲實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • java 實現(xiàn)線程同步的方式有哪些

    java 實現(xiàn)線程同步的方式有哪些

    當(dāng)使用多個線程來訪問同一個數(shù)據(jù)時,非常容易出現(xiàn)線程安全問題,所以我們用同步機(jī)制來解決這些問題,本文將詳細(xì)介紹,需要的朋友可以參考下
    2012-11-11
  • Java Proxy機(jī)制詳細(xì)解讀

    Java Proxy機(jī)制詳細(xì)解讀

    這篇文章主要介紹了Java Proxy機(jī)制詳細(xì)解讀,還是非常不錯的,這里分享給大家,需要的朋友可以參考下。
    2017-10-10
  • MybatisPlus:使用SQL保留字(關(guān)鍵字)的操作

    MybatisPlus:使用SQL保留字(關(guān)鍵字)的操作

    這篇文章主要介紹了MybatisPlus:使用SQL保留字(關(guān)鍵字)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • SpringBoot配置使用H2數(shù)據(jù)庫的簡單教程

    SpringBoot配置使用H2數(shù)據(jù)庫的簡單教程

    H2是一個Java編寫的關(guān)系型數(shù)據(jù)庫,它可以被嵌入Java應(yīng)用程序中使用,或者作為一個單獨的數(shù)據(jù)庫服務(wù)器運行。本文將介紹SpringBoot如何配置使用H2數(shù)據(jù)庫
    2021-05-05
  • java簡單操作word實例

    java簡單操作word實例

    這篇文章主要為大家詳細(xì)介紹了java簡單操作word實例,感興趣的朋友可以參考一下
    2016-03-03
  • Spring為IOC容器注入Bean的五種方式詳解

    Spring為IOC容器注入Bean的五種方式詳解

    這篇文章主要介紹了Spring為IOC容器注入Bean的五種方式詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10

最新評論

鄂托克旗| 天气| 乐安县| 湖北省| 台北县| 枝江市| 永福县| 静安区| 庄河市| 阿勒泰市| 察隅县| 巫山县| 新化县| 乐昌市| 开平市| 泗阳县| 曲麻莱县| 顺平县| 札达县| 福贡县| 垫江县| 溧阳市| 阳朔县| 招远市| 晴隆县| 中方县| 青海省| 哈密市| 始兴县| 花莲市| 涡阳县| 博乐市| 乐平市| 浏阳市| 吴川市| 平果县| 南部县| 明光市| 潮安县| 石景山区| 宜都市|