首頁 > 軟體

使用Autowired為什麼會被IDEA警告最佳修改方法

2023-02-20 06:01:14

問題原因

關於這個問題,其實答案相對統一,實際上用大白話說起來也容易理解。

1.初始化問題

先看一下Java初始化類的順序:父類別的靜態欄位 > 父類別靜態程式碼塊 > 子類靜態欄位 > 子類靜態程式碼塊 > 父類別成員變數 > 父類別構造程式碼塊 > 父類別構造器 > 子類成員變數 > 子類構造程式碼塊 > 子類構造器。

而Autowired注入,則要排隊到子類構造器以後了,SpringIOC並不會對依賴的bean是否為null做判斷,JVM編譯時同樣也不會有問題,但如果使用不當,執行起來時或許會因為出現空指標異常

2.對IOC容易依賴過強

@Autowired由Spring提供,而@Resource是JSR-250提供的,它是Java標準。前者會警告,而後者不警告,就是因為前者導致了應用與框架的強繫結,若是換成其他IOC框架,則不能夠成功注入了。其實對於這方面,我認為在大多數情況時是不會有什麼問題的。

3.其他方面

我看到網路上有一些其他方面的總結,比如:依賴過多卻不夠明顯,違反了單一職責原則不能像構造器那樣注入不可變的物件等,這類問題需要結合個人實際開發進行判斷。

對於@Autowired使用方面,它雖然是將業務程式碼和框架進行了強繫結,但欄位注入確實大幅簡化了程式碼。追求完完全全的鬆耦合其實也過於理想化,應該在實際使用中追求平衡,否則將為了過度追求鬆耦合而得不償失

其他使用方式

除了使用@Autowired以外,我們其實也有幾種好用的方式。使用@Resource替代@Autiwired方法是其中一種,只需要改變一個註解,這裡就不展示了。

1.set方法

@RestController
public class TestController2 {

    ITestService testService;

    /*
     * 基於set注入
     * */
    @Autowired
    public void setTestService(ITestService iTestService) {
        this.testService = iTestService;
    }

    @GetMapping("/status2")
    public Result<?> status() {
        return testService.status();
    }
}

這種方法也使用了@Autowired註解,但是它是作用於成員變數的Setter函數上,而不是像Fied注入一樣作用於成員變數上。

2.構造器

@RestController
public class TestController1 {

    ITestService testService;

    /*
    * 基於構造方法的注入
    * */
    public TestController1(ITestService iTestService) {
        this.testService = iTestService;
    }

    @GetMapping("/status1")
    public Result<?> status() {
        return testService.status();
    }
}

它的好處在於,採用了構造方法注入,這種方式對物件建立的順序會有要求,它將避免迴圈依賴問題。是最可靠的方法。

3.構造器的簡化版(推薦)
首先,需要引入lombok依賴。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.2</version>
</dependency>

隨後,我們在建立時就可以使用@RequiredArgsConstructor註解,它將幫我們建立構造器,final關鍵字必不可少

@RestController
@RequiredArgsConstructor
public class TestController3 {
    /*
     * 用@RequiredArgsConstructor註解,這個使用方式也可以應用於service層
     * */
    private final ITestService testService;


    @GetMapping("/status3")
    public Result<?> status() {
        return testService.status();
    }
}

我們在使用這些建立方法時,都可以調出IDEA的結構(Structure)面板進行檢視,如下圖所示。

可以看到,在這個類中,已經存在我們所需要注入的內容。

在網上有博主總結了一張表,但因為到處能看到,不知原來出處是哪裡。

注入方式可靠性可維護性靈活性迴圈關係檢測效能
Field注入不可靠靈活不檢測啟動快
構造方法可靠不靈活檢測啟動慢
set方法不可靠靈活不檢測啟動快

總結

在使用中,使用構造方法是比較可行的,加上lombok,其實也可以到達非常簡便。

到此這篇關於使用Autowired為什麼會被IDEA警告,應該怎麼修改最佳的文章就介紹到這了,更多相關Autowired IDEA警告內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com