SpringBoot之為何推薦使用構(gòu)造器注入
概述
通過對注解注入、 Setter 注入與構(gòu)造器注入三種注入方式的橫向?qū)Ρ?,解釋為?SpringBoot 推薦用戶使用構(gòu)造器注入。
注解注入
美觀、大方,只需要一個(gè)注解 @Autowired 就可以完成注入。
Show Code
Computer.java
/**
* [ 計(jì)算機(jī) ]
*
* @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ù)用該實(shí)現(xiàn)類。
Room room = new Room(); room.schollroom(); // -> NullPointerException
且注解注入可能會導(dǎo)致循環(huán)依賴,在A中注入B,在B中又注入A。
Setter注入
靈活,可以在類實(shí)例化后,重新注入。
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");
}
}
其實(shí)在 Spring 3.x 官方推薦的注入方式就是這種,因?yàn)榭紤]到使用構(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");
}
}
因?yàn)槭褂?final 修飾詞,所以保證了注入組件的不可變。
因?yàn)榇a中實(shí)現(xiàn)了有參構(gòu)造器,且該參數(shù)需由 Spring 容器傳入,當(dāng) Spring 容器中沒有該參數(shù),則返回錯(cuò)誤,所以保證了注入組件不為空。
在將依賴組件傳入 Room 對象構(gòu)造器前,必須先調(diào)用依賴組件的構(gòu)造方法,所以返回的是完全初始化的狀態(tài)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Spring Batch 輕量級批處理框架實(shí)踐
這篇文章主要介紹了詳解Spring Batch 輕量級批處理框架實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
Spring MVC之WebApplicationContext_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Spring MVC之WebApplicationContext的相關(guān)資料,需要的朋友可以參考下2017-08-08
深入理解Java責(zé)任鏈模式實(shí)現(xiàn)靈活的請求處理流程
本文詳細(xì)介紹了Java中的責(zé)任鏈模式,幫助您理解其工作原理,以及如何在代碼中實(shí)現(xiàn)。該模式可以將請求沿著處理鏈路傳遞,實(shí)現(xiàn)靈活的請求處理流程。通過本文的學(xué)習(xí),您將獲得在Java應(yīng)用程序中使用責(zé)任鏈模式的知識和技能2023-04-04
springboot啟動加載CommandLineRunner @PostConstruct問題
這篇文章主要介紹了springboot啟動加載CommandLineRunner @PostConstruct問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08

