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

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

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

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

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

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

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

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

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

 首先來看字段注入

@RestController
public class TestHandleController {

    @Autowired
    TestHandleService testHandleService;

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

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

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

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

接下來看第二段代碼:

public class TestA(){

    @Autowired
    private TestB testB;

}

public class TestB(){

    @Autowired
    private TestA testA;

}

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

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

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

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

1. 對(duì)象的外部可見性

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

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

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

使用形式也很簡(jiǎn)單:

private TestHandleService testHandleService;

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

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

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

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

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

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)錯(cuò)誤的地方。

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

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

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

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

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

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

Setter注入適合可選對(duì)象注入

字段注入方式應(yīng)該盡量避免,因?yàn)閷?duì)象無法脫離容器獨(dú)立運(yùn)行(話雖這么說,但我還是字段注入用得多,因?yàn)榉奖惆?[/狗頭])

總結(jié)

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

相關(guān)文章

  • 深入理解Java中的Lambda表達(dá)式

    深入理解Java中的Lambda表達(dá)式

    這篇文章主要介紹了深入理解Java中的Lambda表達(dá)式,Lambda在各編程語(yǔ)言中都是非常重要的特性,而Java中則加入得有些太晚...需要的朋友可以參考下
    2015-07-07
  • RocketMQ源碼本地搭建調(diào)試方法

    RocketMQ源碼本地搭建調(diào)試方法

    這篇文章主要介紹了RocketMQ源碼本地搭建調(diào)試,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • Jboss Marshalling服務(wù)端無法接受消息

    Jboss Marshalling服務(wù)端無法接受消息

    這篇文章主要介紹了Jboss Marshalling服務(wù)端無法接受消息,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • java8?時(shí)間日期的使用與格式化示例代碼詳解

    java8?時(shí)間日期的使用與格式化示例代碼詳解

    這篇文章主要介紹了java8?時(shí)間日期的使用與格式化,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • jboss( WildFly)上運(yùn)行 springboot程序的步驟詳解

    jboss( WildFly)上運(yùn)行 springboot程序的步驟詳解

    這篇文章主要介紹了jboss( WildFly)上運(yùn)行 springboot程序的步驟詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Java搭建RabbitMq消息中間件過程詳解

    Java搭建RabbitMq消息中間件過程詳解

    這篇文章主要介紹了Java搭建RabbitMq消息中間件過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 解決SpringBoot框架因post數(shù)據(jù)量過大沒反應(yīng)問題(踩坑)

    解決SpringBoot框架因post數(shù)據(jù)量過大沒反應(yīng)問題(踩坑)

    這篇文章主要介紹了解決SpringBoot框架因post數(shù)據(jù)量過大沒反應(yīng)問題(踩坑),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 簡(jiǎn)單了解Thymeleaf語(yǔ)法 數(shù)據(jù)延遲加載使用實(shí)例

    簡(jiǎn)單了解Thymeleaf語(yǔ)法 數(shù)據(jù)延遲加載使用實(shí)例

    這篇文章主要介紹了簡(jiǎn)單了解Thymeleaf語(yǔ)法 數(shù)據(jù)延遲加載使用實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2010-05-05
  • idea多環(huán)境配置及問題解決方案

    idea多環(huán)境配置及問題解決方案

    這篇文章主要介紹了idea多環(huán)境配置及問題解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Java中的注解與注解處理器

    Java中的注解與注解處理器

    這篇文章主要介紹了Java中的注解與注解處理器,元注解的作用是負(fù)責(zé)注解其他注解, Java5.0定義了4個(gè)標(biāo)準(zhǔn)的meta-annotation(元注解)類型,它們被用來提供對(duì)其它注解類型進(jìn)行說明,需要的朋友可以參考下
    2023-11-11

最新評(píng)論