最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring高級注解之@DependsOn詳解

 更新時間:2024年01月26日 08:46:37   作者:hy_coming  
這篇文章主要介紹了Spring高級注解之@DependsOn詳解,@DependsOn注解可以定義在類和方法上,意思是我這個組件要依賴于另一個組件,也就是說被依賴的組件會比該組件先注冊到IOC容器中,需要的朋友可以參考下

官方文檔

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 <bean depends-on="..."/> is respected instead.

@DependsOn注解的作用

org.springframework.context.annotation.DependsOn該注解的屬性是一個字符串?dāng)?shù)組,數(shù)組的元素是每個依賴的bean的名稱。

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DependsOn {
    String[] value() default {};
}

@DependsOn注解主要用于指定當(dāng)前bean所依賴的beans。任何被指定依賴的bean都由Spring保證在當(dāng)前bean之前創(chuàng)建。在少數(shù)情況下,bean不是通過屬性或構(gòu)造函數(shù)參數(shù)顯式依賴于另一個bean,但卻需要要求另一個bean優(yōu)先完成初始化,則可以使用@DependsOn這個注解。

@DependsOn既可以指定初始化依賴順序,也可以指定bean相應(yīng)的銷毀執(zhí)行順序(僅在單例bean的情況下)。

可用于任何直接或間接帶@Component注解的bean或在用@Bean注釋的方法上。 如果使用的是xml配置,則需要使用<bean dependens on=“…”/>標(biāo)簽.

簡單描述就是@DependsOn可以控制bean的創(chuàng)建、初始化(InitializingBean)、銷毀方法執(zhí)行順序。

示例:假如有三個Bean類叫Aaa、Bbb、Ccc分別實現(xiàn)了如下兩個接口。org.springframework.beans.factory.InitializingBeanorg.springframework.beans.factory.DisposableBean

Ccc通過@DependsOn指定依賴bean創(chuàng)建的順序為Bbb > Aaa

@DependsOn({"bbb","ccc"})
@Service
public class Aaa implements InitializingBean, DisposableBean {
 private static final Logger logger = LoggerFactory.getLogger(Aaa.class);
 public Aaa() {
  logger.info(this.getClass().getName() + " Construction");
 }
 @Override
 public void afterPropertiesSet() throws Exception {
  logger.info(this.getClass().getName() + " afterPropertiesSet");
 }
 @Override
 public void destroy() throws Exception {
  logger.info(this.getClass().getName() + " destroy");
 }
}

Bbb Ccc類實現(xiàn)如下

@Service
public class Bbb implements InitializingBean, DisposableBean {
 //實現(xiàn)和Aaa相同
}
@Service
public class Ccc implements InitializingBean, DisposableBean {
 //實現(xiàn)和Aaa相同
}

那么初始順序如下: bbb --> ccc --> aaa

在這里插入圖片描述

而銷毀方法執(zhí)行順序正好相反如下: aaa --> ccc --> bbb

在這里插入圖片描述

@DependsOn注解的實現(xiàn)原理

Spring在啟動時掃描到一個bean,會封裝成一個BeanDefinition,如果是AnnotatedBeanDefinition則解析類上的注解信息,發(fā)現(xiàn)@DependsOn注解,則讀取value值,調(diào)用BeanDefinition#setDependsOn保存。 源碼見ClassPathBeanDefinitionScanner#doScan,AnnotationConfigUtils#processCommonDefinitionAnnotations(AnnotatedBeanDefinition, AnnotatedTypeMetadata)

創(chuàng)建bean時,也就是調(diào)用AbstractBeanFactory#doGetBean時,會獲取這些被依賴的beanName,按照數(shù)組順序,再調(diào)用AbstractBeanFactory#getBean(beanName)來優(yōu)先創(chuàng)建被依賴的bean,從而達到控制依賴順序。

除此之外,在創(chuàng)建bean時,還會調(diào)用AbstractBeanFactory#registerDisposableBeanIfNecessary來向Spring中注冊帶有銷毀方法的bean,源碼見DefaultSingletonBeanRegistry#registerDisposableBean,內(nèi)部通過LinkedHashMap保存。key為bean名稱。進程退出時,會逆序調(diào)用銷毀方法。 源碼見DefaultSingletonBeanRegistry#destroySingletons

public void destroySingletons() {
    if (logger.isTraceEnabled()) {
        logger.trace("Destroying singletons in " + this);
    }
    synchronized (this.singletonObjects) {
        this.singletonsCurrentlyInDestruction = true;
    }
    String[] disposableBeanNames;
    synchronized (this.disposableBeans) {
        disposableBeanNames = StringUtils.toStringArray(this.disposableBeans.keySet());
    }
    for (int i = disposableBeanNames.length - 1; i >= 0; i--) {
        destroySingleton(disposableBeanNames[i]);
    }
    this.containedBeanMap.clear();
    this.dependentBeanMap.clear();
    this.dependenciesForBeanMap.clear();
    clearSingletonCache();
}

到此這篇關(guān)于Spring高級注解之@DependsOn詳解的文章就介紹到這了,更多相關(guān)@DependsOn詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文了解自定義MVC框架實現(xiàn)

    一文了解自定義MVC框架實現(xiàn)

    這篇文章主要為大家詳細(xì)介紹一下MVC框架自定義實現(xiàn)過程,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下
    2022-07-07
  • Java讀寫txt文件時防止中文亂碼問題出現(xiàn)的方法介紹

    Java讀寫txt文件時防止中文亂碼問題出現(xiàn)的方法介紹

    這篇文章主要介紹了Java讀寫txt文件時防止中文亂碼問題出現(xiàn)的方法,同時需要注意系統(tǒng)默認(rèn)的文本保存編碼的設(shè)置,需要的朋友可以參考下
    2015-12-12
  • maven 配置多個倉庫的方法

    maven 配置多個倉庫的方法

    這篇文章主要介紹了maven 配置多個倉庫的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 堆排序?qū)嵗?Java數(shù)組實現(xiàn))

    堆排序?qū)嵗?Java數(shù)組實現(xiàn))

    下面小編就為大家分享一篇使用Java數(shù)組實現(xiàn)堆排序的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • java 算法之歸并排序詳解及實現(xiàn)代碼

    java 算法之歸并排序詳解及實現(xiàn)代碼

    這篇文章主要介紹了java 算法之歸并排序詳解及實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • logback如何去掉DubboMonitor煩人的INFO日志

    logback如何去掉DubboMonitor煩人的INFO日志

    這篇文章主要介紹了logback如何去掉DubboMonitor煩人的INFO日志方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 解決mapper接口無法映射mapper.xml的問題

    解決mapper接口無法映射mapper.xml的問題

    這篇文章主要介紹了解決mapper接口無法映射mapper.xml的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java創(chuàng)建線程的七種方法總結(jié)(全網(wǎng)最全面)

    Java創(chuàng)建線程的七種方法總結(jié)(全網(wǎng)最全面)

    線程是Java中的基本執(zhí)行單元,它允許程序在同一時間執(zhí)行多個任務(wù),下面這篇文章主要給大家總結(jié)介紹了關(guān)于Java創(chuàng)建線程的七種方法,文中通過實例代碼將這七種方法介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 微信公眾號支付(二)實現(xiàn)統(tǒng)一下單接口

    微信公眾號支付(二)實現(xiàn)統(tǒng)一下單接口

    本篇文章主要給大家介紹調(diào)用微信公眾支付的統(tǒng)一下單API,通過參數(shù)封裝為xml格式并發(fā)送到微信給的接口地址就可以獲得返回內(nèi)容,需要的朋友可以參考下本文
    2015-09-09
  • springboot多線程并發(fā)執(zhí)行任務(wù)

    springboot多線程并發(fā)執(zhí)行任務(wù)

    本文主要介紹了springboot多線程并發(fā)執(zhí)行任務(wù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03

最新評論

左贡县| 时尚| 乌苏市| 汕尾市| 井冈山市| 漳平市| 龙游县| 平罗县| 盘锦市| 东明县| 万山特区| 金平| 乐陵市| 西平县| 张家界市| 宝山区| 太康县| 元朗区| 望江县| 阜阳市| 凤翔县| 武定县| 宜章县| 崇义县| 泰兴市| 霸州市| 泸西县| 连平县| 双鸭山市| 青浦区| 易门县| 尼玛县| 兴宁市| 军事| 那坡县| 安庆市| 当雄县| 文登市| 贡觉县| 文安县| 浑源县|