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

你知道Spring中為何不建議使用字段注入嗎

 更新時間:2021年08月24日 10:04:39   作者:EchoLv  
這篇文章主要給大家介紹了關(guān)于Spring中為何不建議使用字段注入的相關(guān)資料,通過本文你將對Spring的引入方式有更一步的了解,需要的朋友可以參考下

在使用Idea中通過注解注入字段時是否遇見過這樣一個提示:

Field injection is not recommended(不推薦使用字段注入)

一. 什么是字段注入,Spring中依賴注入的方式有哪些?

在Spring中依賴注入有三大類:字段注入、構(gòu)造器注入、Setter方法注入。

字段注入是將Bean作為字段注入到類中,也是最方便,用的最多的注入方式。

二. 官方為什么不推薦使用字段注入

 首先來看字段注入

@RestController
public class TestHandleController {

    @Autowired
    TestHandleService testHandleService;

    public void helloTestService(){
        testHandleService.hello();
    }
}

字段注入的非常的簡便,通過以上代碼我們就可以輕松的使用TestHandleService類,但是如果變成下面這樣呢:

TestHandleController testHandle = new TestHandleController();
testHandle.helloTestService();

這樣執(zhí)行結(jié)果為空指針異常,這就是字段注入的第一個問題:對象的外部可見性,無法在容器外部實例化TestHandleService,類和容器的耦合度過高,無法脫離容器訪問目標(biāo)對象。

接下來看第二段代碼:

public class TestA(){

    @Autowired
    private TestB testB;

}

public class TestB(){

    @Autowired
    private TestA testA;

}

這段代碼在idea中不會報任何錯誤,但是當(dāng)你啟動項目時會發(fā)現(xiàn)報錯,大致意思是:創(chuàng)建Bean失敗,原因是當(dāng)前Bean已經(jīng)作為循環(huán)引用的一部分注入到了其他Bean中。

這就是字段注入的第二個問題:可能導(dǎo)致循環(huán)依賴

字段注入還有第三個問題:無法設(shè)置注入的對象為final,也無法注入靜態(tài)變量,原因是變量必須在類實例化進(jìn)行初始化。

整理一下,字段注入可能引起的三個問題:

1. 對象的外部可見性

2. 可能導(dǎo)致循環(huán)依賴

3. 無法設(shè)置注入的對象為final,也無法注入靜態(tài)變量

 接下來看構(gòu)造器注入--官方推薦的注入方式

使用形式也很簡單:

private TestHandleService testHandleService;

@Autowired
public TestHandleController(TestHandleService testHandleService){
    this.testHandleService = testHandleService;
}

通過構(gòu)造器的方式將Bean注入到字段中。

構(gòu)造器注入能夠保證注入的組件不可變,并且確保需要的依賴不為空。

這樣就可以將變量設(shè)置為final,并且傳遞的肯定是一個對象,避免出現(xiàn)空指針異常。

若是出現(xiàn)字段注入中循環(huán)依賴的問題,在項目啟動時Spring會非常形象的將錯誤拋出來:

Description:

The dependencies of some of the beans in the application context form a cycle:

testContrtoller (field private com.example.designstudy.service.TestService com.example.designstudy.controller.TestContrtoller.testService)
┌─────┐
| testService defined in file [D:\design-study\target\classes\com\example\designstudy\service\TestService.class]
↑ ↓
| testHandleServiceImpl defined in file [D:\design-study\target\classes\com\example\designstudy\service\impl\TestHandleServiceImpl.class]
└─────┘

顯而易見的發(fā)現(xiàn)錯誤的地方。

由此可見,字段注入的三大問題都能解決,但是構(gòu)造器注入就沒有其他問題了嗎?

答案肯定是否定的,當(dāng)依賴的對象很多時,需要嚴(yán)格按照構(gòu)造器的順序去填寫依賴的對象,這將導(dǎo)致代碼可讀性和可維護(hù)性變得很差。

這時候可以引入Setter方法進(jìn)行注入,Setter方法和構(gòu)造器注入很像,不過Setter更具有可讀性。

并且使用Setter方法注入可以實現(xiàn)按需注入,不使用的對象不需要想構(gòu)造器注入一樣強(qiáng)制注入。

總結(jié)一下三種注入方式:

構(gòu)造器注入適用于強(qiáng)制對象注入

Setter注入適合可選對象注入

字段注入方式應(yīng)該盡量避免,因為對象無法脫離容器獨立運行(話雖這么說,但我還是字段注入用得多,因為方便啊 [/狗頭])

總結(jié)

到此這篇關(guān)于為何不建議使用字段注入的文章就介紹到這了,更多相關(guān)Spring不建議使用字段注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java如何根據(jù)實體指定字段值對其List進(jìn)行排序詳解

    Java如何根據(jù)實體指定字段值對其List進(jìn)行排序詳解

    在Java項目中可能會遇到給出一些條件,將List元素按照給定條件進(jìn)行排序的情況,這篇文章主要給大家介紹了關(guān)于Java如何根據(jù)實體指定字段值對其List進(jìn)行排序的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • 現(xiàn)代高效的java構(gòu)建工具gradle的快速入門

    現(xiàn)代高效的java構(gòu)建工具gradle的快速入門

    和Maven一樣,Gradle只是提供了構(gòu)建項目的一個框架,真正起作用的是Plugin,本文主要介紹了gradle入門,文中通過示例代碼介紹的非常詳細(xì),感興趣的小伙伴們可以參考一下
    2021-11-11
  • 一文深入理解Java中的深拷貝機(jī)制

    一文深入理解Java中的深拷貝機(jī)制

    在Java編程中,我們經(jīng)常需要處理對象的復(fù)制問題,深拷貝和淺拷貝是兩種常見的復(fù)制方式,它們在內(nèi)存管理和對象引用方面存在不同特點,本文將帶大家深入探究Java中的深拷貝機(jī)制,需要的朋友可以參考下
    2023-09-09
  • 一文帶你搞懂Java中的數(shù)據(jù)流處理

    一文帶你搞懂Java中的數(shù)據(jù)流處理

    這篇文章主要為大家詳細(xì)介紹了Java中數(shù)據(jù)流處理的相關(guān)知識,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • SpringBoot使用統(tǒng)一異常處理詳解

    SpringBoot使用統(tǒng)一異常處理詳解

    這篇文章主要為大家詳細(xì)介紹了SpringBoot使用統(tǒng)一異常處理,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • SpringBoot上傳文件大小受限問題的解決辦法

    SpringBoot上傳文件大小受限問題的解決辦法

    最近有一次由于項目升級發(fā)現(xiàn)了一個上傳方面的問題,下面這篇文章主要給大家介紹了關(guān)于SpringBoot上傳文件大小受限問題的解決辦法,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • 解決SSLContext.getInstance()中參數(shù)設(shè)置TLS版本無效的問題

    解決SSLContext.getInstance()中參數(shù)設(shè)置TLS版本無效的問題

    這篇文章主要介紹了解決SSLContext.getInstance()中參數(shù)設(shè)置TLS版本無效的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 在RedHat系統(tǒng)上安裝JDK與Tomcat的步驟

    在RedHat系統(tǒng)上安裝JDK與Tomcat的步驟

    這篇文章主要介紹了在RedHat系統(tǒng)上安裝Java與Tomcat的步驟,同樣適用于CentOS等RedHat系的Linux系統(tǒng),需要的朋友可以參考下
    2015-11-11
  • 詳解Java單元測試Junit框架實例

    詳解Java單元測試Junit框架實例

    這篇文章主要介紹了Java的異常測試框架JUnit使用上手指南,JUnit是Java代碼進(jìn)行單元測試中的常用工具,需要的朋友可以參考下
    2017-04-04
  • java實現(xiàn)微信支付功能

    java實現(xiàn)微信支付功能

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)微信支付功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09

最新評論

普安县| 泰宁县| 通州市| 闸北区| 本溪| 汽车| 安宁市| 长葛市| 吉木萨尔县| 蓬溪县| 上饶县| 阳原县| 澄江县| 偏关县| 郴州市| 久治县| 龙口市| 治县。| 梁河县| 即墨市| 当阳市| 大竹县| 墨竹工卡县| 江口县| 白河县| 玛纳斯县| 商洛市| 红原县| 宜阳县| 高唐县| 内乡县| 凌海市| 福泉市| 安新县| 页游| 黑河市| 柘荣县| 宁都县| 织金县| 磴口县| 竹北市|