Spring中用@DependsOn注解控制Bean的創建順序


1. 概述
Spirng容器自己會管理bean的生命周期和bean實例化的順序,但是我們仍然可以根據我們自己的需求進行定制。我可以可以選擇使用SmartLifeCycle接口,也可以用@DependsOn注解來管理初始化順序。
這個說明文檔展示了@DependsOn的用法和依賴的bean缺失的問題和bean循環依賴(在一個bean實例化過程中依賴另一個bean)的問題。
2. Maven
首選,我們導入spring-context-xxx.jar的依賴。我們需要在pom.xml中加入以內容:
 
org.springframework
spring-context
5.2.8.RELEASE
 
 
 
3. @DependsOn
我們使用這個注解定制需要依賴的bean,Spring 保證被依賴的bean將會在當前bean之前初始化。比如我們需要實例化FileProcessor,它所依賴的FileReader 和 FileWriter將會在FileProcessor之前被初始化。
4. 配置
用java注解方式(@Configuration)配置spirng:
0
 
我們使用@DependsOn注解配置了依賴。
 
5. 用法
測試代碼:
0
5.1. 依賴缺失
 
Spring在依賴bean缺失的情況下,將拋出異常BeanCreationException,root cause是
NoSuchBeanDefinitionException
0
5.2. 循環依賴
 
循環依賴情況下,將會拋出BeanCreationException,並且在異常信息中會告知哪個bean有循環依賴問題。
0
 
如下圖bean的依賴關系,就會產生一個循環依賴(注意:如果沒有使用@DependsOn注入,普通的@Autowire是不會循環依賴的,上一章講的earlySingletonObjects緩存會解決這個問題)。
0
 
6. 關鍵點
注意點:
  • 當我們使用@DependsOn時候我們必須用component-scanning
  • 如果在xml配置文件中使用@DependsOn,@DependsOn將不會生效。
 
7. 結論
當我們構建的系統有復雜的依賴需求的時候,@DependsOn將會很有用。
他保障了spring在實例化某個bean前先完成它依賴的bean的初始化
 
0
 
原英文文檔和demo源碼地址: https://www.baeldung.com/spring-depends-on


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM