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)文章
Shell重啟SpringBoot項目腳本的示例代碼(含服務(wù)守護)
本文介紹了如何使用?Bash?腳本來管理和守護運行服務(wù),將展示一個示例腳本,該腳本可以停止、啟動和守護運行一個服務(wù),并提供了相應(yīng)的解釋和用法說明,文章通過代碼示例介紹的非常詳細,需要的朋友可以參考下2023-11-11SpringBoot工程Docker多環(huán)境中使用同一個Jar包解決方案
在Docker多環(huán)境部署中,SpringBoot工程可以通過環(huán)境變量來動態(tài)改變配置,無需重新打包,利用volume掛載或docker?cp命令,可以將配置文件直接傳入容器,提高部署效率,并保證安全性2024-09-09服務(wù)器實現(xiàn)Java遠程訪問Linux服務(wù)器方式(JSch)
文章介紹了如何使用Java遠程訪問Linux服務(wù)器,主要包括建立SSH連接、使用JSch庫執(zhí)行命令、解析返回值以及關(guān)閉連接的步驟2024-11-11Java實現(xiàn)MySQL數(shù)據(jù)實時同步至Elasticsearch的方法詳解
MySQL擅長事務(wù)處理,而Elasticsearch(ES)則專注于搜索與分析,將MySQL數(shù)據(jù)實時同步到ES,可以充分發(fā)揮兩者的優(yōu)勢,下面我們就來看看如何使用Java實現(xiàn)這一功能吧2025-03-03java之使用多線程代替for循環(huán)(解決主線程提前結(jié)束問題)
這篇文章主要介紹了java之使用多線程代替for循環(huán)(解決主線程提前結(jié)束問題),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03Spring Boot系列教程之7步集成RabbitMQ的方法
RabbitMQ 即一個消息隊列,主要是用來實現(xiàn)應(yīng)用程序的異步和解耦,同時也能起到消息緩沖,消息分發(fā)的作用。下面這篇文章主要給大家介紹了關(guān)于Spring Boot之7步集成RabbitMQ的相關(guān)資料,需要的朋友可以參考下2018-11-11JPA @Basic單表查詢?nèi)绾螌崿F(xiàn)大字段懶加載
這篇文章主要介紹了JPA @Basic單表查詢?nèi)绾螌崿F(xiàn)大字段懶加載的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08