- Spring Boot進階:原理、實戰(zhàn)與面試題分析
- 鄭天民
- 572字
- 2022-07-05 09:41:41
2.1.2 構(gòu)造器注入
構(gòu)造器注入的形式也很簡單,就是通過類的構(gòu)造函數(shù)來完成對象的注入,示例代碼如代碼清單2-5所示。
代碼清單2-5 構(gòu)造器注入示例代碼
public class ClientService { private HealthRecordService healthRecordService; @Autowired public ClientService(HealthRecordService healthRecordService) { this.healthRecordService = healthRecordService; } public void recordUserHealthData() { healthRecordService.recordUserHealthData(); } }
可以看到構(gòu)造器注入能解決對象外部可見性的問題,因為HealthRecordService是通過ClientService構(gòu)造函數(shù)進行注入的,所以勢必可以脫離ClientService而獨立存在。
我們進一步引用Spring官方文檔來解釋構(gòu)造器注入的特性:
The Spring team generally advocates constructor injection as it enables one to implement application components as immutable objects and to ensure that required dependencies are not null. Furthermore constructor-injected components are always returned to client (calling) code in a fully initialized state.
這段話的核心意思在于:構(gòu)造器注入能夠保證注入的組件不可變,并且確保需要的依賴不為空。這里的組件不可變就意味著我們可以使用final關(guān)鍵詞來修飾所依賴的對象,而依賴不為空是指所傳入的依賴對象肯定是一個實例對象,從而避免出現(xiàn)空指針異常。
同時,基于構(gòu)造器注入,我們也來討論前面介紹的ClassA和ClassB之間的循環(huán)依賴關(guān)系,實現(xiàn)方式如代碼清單2-6所示。
代碼清單2-6 基于構(gòu)造器注入的循環(huán)依賴示例代碼
public class ClassA { private ClassB classB; @Autowired public ClassA(ClassB classB) { this.classB = classB; } } public class ClassB { private ClassA classA; @Autowired public ClassB(ClassA classA) { this.classA = classA; } }
一旦采用構(gòu)造器注入,在Spring項目啟動的時候,就會拋出一個循環(huán)依賴異常,從而提醒你避免使用循環(huán)依賴。
通過上述分析,我們可以看到字段注入的三大問題都可以通過使用構(gòu)造器注入的方式來解決。但是,構(gòu)造器注入的顯著問題就是當構(gòu)造函數(shù)中存在較多依賴對象時,大量的構(gòu)造器參數(shù)會讓代碼冗長。這時候就可以引入Setter方法注入。
- 無代碼編程:用云表搭建企業(yè)數(shù)字化管理平臺
- PHP基礎案例教程
- 編譯系統(tǒng)透視:圖解編譯原理
- ADI DSP應用技術(shù)集錦
- ArcGIS By Example
- Elasticsearch for Hadoop
- R Deep Learning Cookbook
- Python機器學習基礎教程
- Mastering JavaScript High Performance
- 基于Struts、Hibernate、Spring架構(gòu)的Web應用開發(fā)
- 區(qū)塊鏈國產(chǎn)化實踐指南:基于Fabric 2.0
- Maker基地嘉年華:玩轉(zhuǎn)樂動魔盒學Scratch
- PyQt編程快速上手
- IPython Interactive Computing and Visualization Cookbook
- 深入實踐C++模板編程