你知道Spring中為何不建議使用字段注入嗎
在使用Idea中通過注解注入字段時是否遇見過這樣一個提示:
Field injection is not recommended(不推薦使用字段注入)
一. 什么是字段注入,Spring中依賴注入的方式有哪些?
在Spring中依賴注入有三大類:字段注入、構(gòu)造器注入、Setter方法注入。
字段注入是將Bean作為字段注入到類中,也是最方便,用的最多的注入方式。
二. 官方為什么不推薦使用字段注入
首先來看字段注入
@RestController public class TestHandleController { @Autowired TestHandleService testHandleService; public void helloTestService(){ testHandleService.hello(); } }
字段注入的非常的簡便,通過以上代碼我們就可以輕松的使用TestHandleService類,但是如果變成下面這樣呢:
TestHandleController testHandle = new TestHandleController(); testHandle.helloTestService();
這樣執(zhí)行結(jié)果為空指針異常,這就是字段注入的第一個問題:對象的外部可見性,無法在容器外部實例化TestHandleService,類和容器的耦合度過高,無法脫離容器訪問目標對象。
接下來看第二段代碼:
public class TestA(){ @Autowired private TestB testB; } public class TestB(){ @Autowired private TestA testA; }
這段代碼在idea中不會報任何錯誤,但是當你啟動項目時會發(fā)現(xiàn)報錯,大致意思是:創(chuàng)建Bean失敗,原因是當前Bean已經(jīng)作為循環(huán)引用的一部分注入到了其他Bean中。
這就是字段注入的第二個問題:可能導(dǎo)致循環(huán)依賴
字段注入還有第三個問題:無法設(shè)置注入的對象為final,也無法注入靜態(tài)變量,原因是變量必須在類實例化進行初始化。
整理一下,字段注入可能引起的三個問題:
1. 對象的外部可見性
2. 可能導(dǎo)致循環(huán)依賴
3. 無法設(shè)置注入的對象為final,也無法注入靜態(tài)變量
接下來看構(gòu)造器注入--官方推薦的注入方式
使用形式也很簡單:
private TestHandleService testHandleService; @Autowired public TestHandleController(TestHandleService testHandleService){ this.testHandleService = testHandleService; }
通過構(gòu)造器的方式將Bean注入到字段中。
構(gòu)造器注入能夠保證注入的組件不可變,并且確保需要的依賴不為空。
這樣就可以將變量設(shè)置為final,并且傳遞的肯定是一個對象,避免出現(xiàn)空指針異常。
若是出現(xiàn)字段注入中循環(huán)依賴的問題,在項目啟動時Spring會非常形象的將錯誤拋出來:
Description:
The dependencies of some of the beans in the application context form a cycle:
testContrtoller (field private com.example.designstudy.service.TestService com.example.designstudy.controller.TestContrtoller.testService)
┌─────┐
| testService defined in file [D:\design-study\target\classes\com\example\designstudy\service\TestService.class]
↑ ↓
| testHandleServiceImpl defined in file [D:\design-study\target\classes\com\example\designstudy\service\impl\TestHandleServiceImpl.class]
└─────┘
顯而易見的發(fā)現(xiàn)錯誤的地方。
由此可見,字段注入的三大問題都能解決,但是構(gòu)造器注入就沒有其他問題了嗎?
答案肯定是否定的,當依賴的對象很多時,需要嚴格按照構(gòu)造器的順序去填寫依賴的對象,這將導(dǎo)致代碼可讀性和可維護性變得很差。
這時候可以引入Setter方法進行注入,Setter方法和構(gòu)造器注入很像,不過Setter更具有可讀性。
并且使用Setter方法注入可以實現(xiàn)按需注入,不使用的對象不需要想構(gòu)造器注入一樣強制注入。
總結(jié)一下三種注入方式:
構(gòu)造器注入適用于強制對象注入
Setter注入適合可選對象注入
字段注入方式應(yīng)該盡量避免,因為對象無法脫離容器獨立運行(話雖這么說,但我還是字段注入用得多,因為方便啊 [/狗頭])
總結(jié)
到此這篇關(guān)于為何不建議使用字段注入的文章就介紹到這了,更多相關(guān)Spring不建議使用字段注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Jboss Marshalling服務(wù)端無法接受消息
這篇文章主要介紹了Jboss Marshalling服務(wù)端無法接受消息,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-03-03jboss( WildFly)上運行 springboot程序的步驟詳解
這篇文章主要介紹了jboss( WildFly)上運行 springboot程序的步驟詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02解決SpringBoot框架因post數(shù)據(jù)量過大沒反應(yīng)問題(踩坑)
這篇文章主要介紹了解決SpringBoot框架因post數(shù)據(jù)量過大沒反應(yīng)問題(踩坑),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09簡單了解Thymeleaf語法 數(shù)據(jù)延遲加載使用實例
這篇文章主要介紹了簡單了解Thymeleaf語法 數(shù)據(jù)延遲加載使用實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2010-05-05