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:

我們使用@DependsOn注解配置了依賴。
5. 用法
測試代碼:

5.1. 依賴缺失
Spring在依賴bean缺失的情況下,將拋出異常BeanCreationException,root cause是
NoSuchBeanDefinitionException

5.2. 循環依賴
循環依賴情況下,將會拋出BeanCreationException,並且在異常信息中會告知哪個bean有循環依賴問題。

如下圖bean的依賴關系,就會產生一個循環依賴(注意:如果沒有使用@DependsOn注入,普通的@Autowire是不會循環依賴的,上一章講的earlySingletonObjects緩存會解決這個問題)。

6. 關鍵點
注意點:
- 當我們使用@DependsOn時候我們必須用component-scanning
- 如果在xml配置文件中使用@DependsOn,@DependsOn將不會生效。
7. 結論
當我們構建的系統有復雜的依賴需求的時候,@DependsOn將會很有用。
他保障了spring在實例化某個bean前先完成它依賴的bean的初始化

原英文文檔和demo源碼地址:
https://www.baeldung.com/spring-depends-on