SpringBoot之為何推薦使用構(gòu)造器注入
概述
通過對(duì)注解注入、 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");
}
}
對(duì)于IOC容器以外的環(huán)境,除了使用反射來提供它需要的依賴之外,無法復(fù)用該實(shí)現(xiàn)類。
Room room = new Room(); room.schollroom(); // -> NullPointerException
且注解注入可能會(huì)導(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)造器注的方式,如果需要注入到依賴過多,就會(huì)使得構(gòu)造器的參數(shù)過長(zhǎng)。
但在更新到 4.x 官方又轉(zhuǎn)回推薦構(gòu)造器注入,原因下文會(huì)說。
構(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 對(duì)象構(gòu)造器前,必須先調(diào)用依賴組件的構(gòu)造方法,所以返回的是完全初始化的狀態(tài)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Shell重啟SpringBoot項(xiàng)目腳本的示例代碼(含服務(wù)守護(hù))
本文介紹了如何使用?Bash?腳本來管理和守護(hù)運(yùn)行服務(wù),將展示一個(gè)示例腳本,該腳本可以停止、啟動(dòng)和守護(hù)運(yùn)行一個(gè)服務(wù),并提供了相應(yīng)的解釋和用法說明,文章通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
java實(shí)現(xiàn)自定義日期選擇器的方法實(shí)例
日期選擇器是我們?nèi)粘i_發(fā)中經(jīng)常需要用到的一個(gè)功能,下面這篇文章主要給大家介紹了關(guān)于利用java實(shí)現(xiàn)自定義日期選擇器的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10
SpringBoot工程Docker多環(huán)境中使用同一個(gè)Jar包解決方案
在Docker多環(huán)境部署中,SpringBoot工程可以通過環(huán)境變量來動(dòng)態(tài)改變配置,無需重新打包,利用volume掛載或docker?cp命令,可以將配置文件直接傳入容器,提高部署效率,并保證安全性2024-09-09
服務(wù)器實(shí)現(xiàn)Java遠(yuǎn)程訪問Linux服務(wù)器方式(JSch)
文章介紹了如何使用Java遠(yuǎn)程訪問Linux服務(wù)器,主要包括建立SSH連接、使用JSch庫(kù)執(zhí)行命令、解析返回值以及關(guān)閉連接的步驟2024-11-11
Java實(shí)現(xiàn)MySQL數(shù)據(jù)實(shí)時(shí)同步至Elasticsearch的方法詳解
MySQL擅長(zhǎng)事務(wù)處理,而Elasticsearch(ES)則專注于搜索與分析,將MySQL數(shù)據(jù)實(shí)時(shí)同步到ES,可以充分發(fā)揮兩者的優(yōu)勢(shì),下面我們就來看看如何使用Java實(shí)現(xiàn)這一功能吧2025-03-03
Java堆&優(yōu)先級(jí)隊(duì)列示例講解(上)
這篇文章主要通過示例詳細(xì)為大家介紹Java中的堆以及優(yōu)先級(jí)隊(duì)列,文中的示例代碼講解詳細(xì),對(duì)我們了解java有一定幫助,需要的可以參考一下2022-03-03
java之使用多線程代替for循環(huán)(解決主線程提前結(jié)束問題)
這篇文章主要介紹了java之使用多線程代替for循環(huán)(解決主線程提前結(jié)束問題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Spring Boot系列教程之7步集成RabbitMQ的方法
RabbitMQ 即一個(gè)消息隊(duì)列,主要是用來實(shí)現(xiàn)應(yīng)用程序的異步和解耦,同時(shí)也能起到消息緩沖,消息分發(fā)的作用。下面這篇文章主要給大家介紹了關(guān)于Spring Boot之7步集成RabbitMQ的相關(guān)資料,需要的朋友可以參考下2018-11-11
JPA @Basic單表查詢?nèi)绾螌?shí)現(xiàn)大字段懶加載
這篇文章主要介紹了JPA @Basic單表查詢?nèi)绾螌?shí)現(xiàn)大字段懶加載的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08

