SpringBoot中的@DependsOn注解詳解
@DependsOn
@DependsOn注解主要用于指定當前BEAN所依賴的BEANS。任何被指定的依賴的BEAN都由Spring容器保證在當前BEAN之前創(chuàng)建和加載。
在某些場景下,BEAN不是通過屬性或構(gòu)造函數(shù)參數(shù)顯式依賴于另一個BEAN,但卻需要要求另一個BEAN優(yōu)先完成初始化,則可以使用@DependsOn這個注解。
@DependsOn既可以指定初始化的依賴順序,也可以指定BEAN相應的銷毀執(zhí)行順序(僅在單例bean的情況下)。
注解@DependsOn位于如下包
org.springframework.context.annotation
該注解用于聲明當前bean依賴于另外一個bean。所依賴的bean會被容器確保在當前bean實例化之前被實例化。
舉例來講,如果容器通過@DependsOn注解方式定義了bean plant依賴于bean water,那么容器在會確保bean water的實例在實例化bean plant之前完成。
一般用在一個bean沒有通過屬性或者構(gòu)造函數(shù)參數(shù)顯式依賴另外一個bean,但實際上會使用到那個bean或者那個bean產(chǎn)生的某些結(jié)果的情況。
使用目的
控制BEAN的加載順序。
用來表示一個BEAN-A的實例化依賴另一個BEAN-B的實例化, 但是BEAN-A并不需要持有一個BEAN-B的對象,如果需要則需要使用依賴注入或者ref標簽。
注解源碼
// 該注解的屬性是一個字符串數(shù)組,數(shù)組的元素是每個依賴的BEAN的名稱。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DependsOn {
String[] value() default {};
}官方說明
Beans on which the current bean depends. Any beans specified are guaranteed to be created by the container before this bean. Used infrequently in cases where a bean does not explicitly depend on another through properties or constructor arguments, but rather depends on the side effects of another bean's initialization. A depends-on declaration can specify both an initialization-time dependency and, in the case of singleton beans only, a corresponding destruction-time dependency. Dependent beans that define a depends-on relationship with a given bean are destroyed first, prior to the given bean itself being destroyed. Thus, a depends-on declaration can also control shutdown order. May be used on any class directly or indirectly annotated with org.springframework.stereotype.Component or on methods annotated with Bean. Using DependsOn at the class level has no effect unless component-scanning is being used. If a DependsOn-annotated class is declared via XML, DependsOn annotation metadata is ignored, and is respected instead.
使用說明
- @DependsOn注解可以定義在類和方法上;
- 直接或者間接標注在帶有@Component注解的類上面;
- 直接或者間接標注在帶有@Bean 注解的方法上面;
- 如果使用的是XML配置,則需要使用標簽;
- @DependsOn({“BEAN-NAME-1”, “BEAN-NAME-2”}),先創(chuàng)建BEAN-NAME-1,再創(chuàng)建BEAN-NAME-2,最后再創(chuàng)建當前的BEAN。
組合使用
可以與@Component注解和@Bean注解組合使用。
示例代碼
@DependsOn({"c", "b"})
@Component
public class A implements InitializingBean, DisposableBean {
public A() {
System.out.println("TO CREATE: " + this.getClass().getName());
}
@Override
public void afterPropertiesSet() throws Exception {
}
@Override
public void destroy() throws Exception {
System.out.println("TO DESTROY: " + this.getClass().getName());
}
}
@Component
public class B implements InitializingBean, DisposableBean {
public B() {
System.out.println("TO CREATE: " + this.getClass().getName());
}
@Override
public void afterPropertiesSet() throws Exception {
}
@Override
public void destroy() throws Exception {
System.out.println("TO DESTROY: " + this.getClass().getName());
}
}
@Component
public class C implements InitializingBean, DisposableBean {
public C() {
System.out.println("TO CREATE: " + this.getClass().getName());
}
@Override
public void afterPropertiesSet() throws Exception {
}
@Override
public void destroy() throws Exception {
System.out.println("TO DESTROY: " + this.getClass().getName());
}
}加載與創(chuàng)建順序:C、B、A
銷毀順序與創(chuàng)建順序相反:A、B、C
@DependsOn和@Lazy的區(qū)別
- @DependsOn注解用于指定各個BEAN的依賴順序;
- @Lazy注解用于指定該類是否能夠懶加載,也就是說如果一個類不需要在啟動時實例化,那么就可以使用@Lazy注解進行懶加載,在第一次使用時創(chuàng)建并實例化。
- 可以使用@Lazy注解將某些BEAN在第一次使用時創(chuàng)建并加載到SPRING容器中;
- @Lazy注解只對單例有用,它讓BEAN在SPRING啟動時不會加載到容器中,只有在代碼里第一次調(diào)用時才創(chuàng)建并加載到容器中;
- 如果只在某個類上添加@Lazy注解,但是其他代碼依賴了該類,那么即使在該類上添加了@Lazy注解,也依然會在IoC容器初始化時實例化該類,也就是@Lazy注解失效了,這就是由代碼之間的依賴導致的@Lazy注解失效;如果希望在使用時才去實例化,那么就需要在每個依賴該類的地方也添加@Lazy注解;
- 如上代碼所示,如果在C這個BEAN上也添加了@Lazy注解,則@Lazy注解也會失效,這就是由@DependsOn注解引起的@Lazy注解失效。
到此這篇關(guān)于SpringBoot中的@DependsOn注解詳解的文章就介紹到這了,更多相關(guān)@DependsOn注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring為java.util.Properties類型的屬性進行賦值過程解析
這篇文章主要介紹了spring為java.util.Properties類型的屬性進行賦值過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-01-01
關(guān)于JSON.toJSONString()和Gson.toJson()方法的比較
本文介紹了兩種將Java對象轉(zhuǎn)換為JSON字符串的方法:阿里的`JSON.toJSONString()`和谷歌的`Gson.toJson()`,通過一個示例,展示了當使用繼承關(guān)系且子類覆蓋父類字段時,`Gson`會報錯,而`JSON`可以正常運行,作者建議在處理JSON相關(guān)操作時使用阿里的`JSON`類2024-11-11
修改Springboot默認序列化工具Jackson配置的實例代碼
這篇文章主要介紹了如何修改Springboot默認序列化工具Jackson的配置,當Spring容器中存在多個同類型的Bean時,默認情況下最后一個創(chuàng)建的Bean將作為首選Bean,文中通過代碼給大家介紹的非常詳細,需要的朋友可以參考下2024-02-02
IDEA2024創(chuàng)建Web項目以及配置Tomcat的實現(xiàn)步驟
在Web項目的開發(fā)過程中,Tomcat作為一款開源的Servlet容器,扮演著至關(guān)重要的角色,本文將詳細闡述2024版本的idea配置Tomcat的全過程,下面就來詳細的介紹一下2025-10-10
Java Spire.PDF實現(xiàn)PDF表單數(shù)據(jù)自動導入與導出
對于Java開發(fā)者而言,處理PDF表單數(shù)據(jù)往往伴隨著諸多挑戰(zhàn),本文將借助 Spire.PDF for Java 這一強大工具,清晰地展示如何實現(xiàn)PDF表單數(shù)據(jù)的導入與導出,感興趣的小伙伴可以了解下2026-02-02
SpringCloud整合分布式服務跟蹤zipkin的實現(xiàn)
這篇文章主要介紹了SpringCloud整合分布式服務跟蹤zipkin的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09
關(guān)于文件上傳MultipartBody的使用方法
這篇文章主要介紹了關(guān)于文件上傳MultipartBody的使用方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06

