SpringBoot之為何推薦使用構造器注入
概述
通過對注解注入、 Setter 注入與構造器注入三種注入方式的橫向對比,解釋為何 SpringBoot 推薦用戶使用構造器注入。
注解注入
美觀、大方,只需要一個注解 @Autowired 就可以完成注入。
Show Code
Computer.java
/** * [ 計算機 ] * * @author Kareza * @time 2021/5/25 10:58 上午 * @since 1.8 */ @Component public class Computer { /** * 上網 */ public void surfInternet(String user) { Console.log("{} 正在上網沖浪", 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("書房里~~"); // 網上沖浪 computer.surfInternet("chenyiqiang"); } }
對于IOC容器以外的環(huán)境,除了使用反射來提供它需要的依賴之外,無法復用該實現類。
Room room = new Room(); room.schollroom(); // -> NullPointerException
且注解注入可能會導致循環(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("書房里~~"); // 網上沖浪 computer.surfInternet("chenyiqiang"); } }
其實在 Spring 3.x 官方推薦的注入方式就是這種,因為考慮到使用構造器注的方式,如果需要注入到依賴過多,就會使得構造器的參數過長。
但在更新到 4.x 官方又轉回推薦構造器注入,原因下文會說。
構造器注入
保證注入的組件不可變且不為空
保證使用構造器注入的類呈完全初始化的狀態(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("書房里~~"); // 網上沖浪 computer.surfInternet("chenyiqiang"); } }
因為使用 final 修飾詞,所以保證了注入組件的不可變。
因為代碼中實現了有參構造器,且該參數需由 Spring 容器傳入,當 Spring 容器中沒有該參數,則返回錯誤,所以保證了注入組件不為空。
在將依賴組件傳入 Room 對象構造器前,必須先調用依賴組件的構造方法,所以返回的是完全初始化的狀態(tài)。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Shell重啟SpringBoot項目腳本的示例代碼(含服務守護)
本文介紹了如何使用?Bash?腳本來管理和守護運行服務,將展示一個示例腳本,該腳本可以停止、啟動和守護運行一個服務,并提供了相應的解釋和用法說明,文章通過代碼示例介紹的非常詳細,需要的朋友可以參考下2023-11-11SpringBoot工程Docker多環(huán)境中使用同一個Jar包解決方案
在Docker多環(huán)境部署中,SpringBoot工程可以通過環(huán)境變量來動態(tài)改變配置,無需重新打包,利用volume掛載或docker?cp命令,可以將配置文件直接傳入容器,提高部署效率,并保證安全性2024-09-09Java實現MySQL數據實時同步至Elasticsearch的方法詳解
MySQL擅長事務處理,而Elasticsearch(ES)則專注于搜索與分析,將MySQL數據實時同步到ES,可以充分發(fā)揮兩者的優(yōu)勢,下面我們就來看看如何使用Java實現這一功能吧2025-03-03java之使用多線程代替for循環(huán)(解決主線程提前結束問題)
這篇文章主要介紹了java之使用多線程代替for循環(huán)(解決主線程提前結束問題),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03Spring Boot系列教程之7步集成RabbitMQ的方法
RabbitMQ 即一個消息隊列,主要是用來實現應用程序的異步和解耦,同時也能起到消息緩沖,消息分發(fā)的作用。下面這篇文章主要給大家介紹了關于Spring Boot之7步集成RabbitMQ的相關資料,需要的朋友可以參考下2018-11-11