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

SpringBoot之為何推薦使用構(gòu)造器注入

 更新時間:2024年03月27日 10:22:18   作者:Kareza  
這篇文章主要介紹了SpringBoot之為何推薦使用構(gòu)造器注入問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

概述

通過對注解注入、 Setter 注入與構(gòu)造器注入三種注入方式的橫向?qū)Ρ?,解釋為?SpringBoot 推薦用戶使用構(gòu)造器注入。

注解注入

美觀、大方,只需要一個注解 @Autowired 就可以完成注入。

Show Code

Computer.java

/**
 * [ 計算機 ]
 *
 * @author Kareza
 * @time 2021/5/25 10:58 上午
 * @since 1.8
 */
@Component
public class Computer {
    /**
     * 上網(wǎng)
     */
    public void surfInternet(String user) {
        Console.log("{} 正在上網(wǎng)沖浪", user);
    }
}

Room.java

/**
 * [ 房間 ]
 * @author Kareza
 * @since 1.8
 * @time 2021/5/25 11:42 上午
 */
@Service
public class Room {

    @Autowired
    private Computer computer;

    /**
     * 書房
     */
    public void schoolroom() {
        Console.log("書房里~~");
        // 網(wǎng)上沖浪
        computer.surfInternet("chenyiqiang");
    }
}

對于IOC容器以外的環(huán)境,除了使用反射來提供它需要的依賴之外,無法復(fù)用該實現(xiàn)類。

Room room = new Room();
room.schollroom(); // -> NullPointerException

且注解注入可能會導(dǎo)致循環(huán)依賴,在A中注入B,在B中又注入A。

Setter注入

靈活,可以在類實例化后,重新注入。

Show Code

Computer.java

同上

Room.java

/**
 * [ 房間 ]
 * @author Kareza
 * @since 1.8
 * @time 2021/5/25 11:42 上午
 */
@Service
public class Room {

    private Computer computer;

    @Autowired
    public void setComputer(Computer computer) {
        this.computer = computer;
    }

    /**
     * 書房
     */
    public void schoolroom() {
        Console.log("書房里~~");
        // 網(wǎng)上沖浪
        computer.surfInternet("chenyiqiang");
    }
}

其實在 Spring 3.x 官方推薦的注入方式就是這種,因為考慮到使用構(gòu)造器注的方式,如果需要注入到依賴過多,就會使得構(gòu)造器的參數(shù)過長。

但在更新到 4.x 官方又轉(zhuǎn)回推薦構(gòu)造器注入,原因下文會說。

構(gòu)造器注入

保證注入的組件不可變不為空

保證使用構(gòu)造器注入的類呈完全初始化的狀態(tài)

Show Code

Computer.java

同上

Room.java

/**
 * [ 房間 ]
 * @author Kareza
 * @since 1.8
 * @time 2021/5/25 11:42 上午
 */
@Service
public class Room {

    private final Computer computer;

    @Autowired
    public Room(Computer computer) {
        this.computer = computer;
    }

    /**
     * 書房
     */
    public void schoolroom() {
        Console.log("書房里~~");
        // 網(wǎng)上沖浪
        computer.surfInternet("chenyiqiang");
    }
}

因為使用 final 修飾詞,所以保證了注入組件的不可變。

因為代碼中實現(xiàn)了有參構(gòu)造器,且該參數(shù)需由 Spring 容器傳入,當(dāng) Spring 容器中沒有該參數(shù),則返回錯誤,所以保證了注入組件不為空。

在將依賴組件傳入 Room 對象構(gòu)造器前,必須先調(diào)用依賴組件的構(gòu)造方法,所以返回的是完全初始化的狀態(tài)。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論