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

Spring中@DependsOn注解的作用及實(shí)現(xiàn)原理解析

 更新時(shí)間:2021年03月10日 09:00:55   作者:brucelwl  
這篇文章主要介紹了Spring中@DependsOn注解的作用及實(shí)現(xiàn)原理解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

本文給大家講解Spring中@DependsOn注解的作用及實(shí)現(xiàn)原理!

官方文檔解釋

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
該注解的屬性是一個(gè)字符串?dāng)?shù)組,數(shù)組的元素是每個(gè)依賴的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ù)顯式依賴于另一個(gè)bean,但卻需要要求另一個(gè)bean優(yōu)先完成初始化,則可以使用@DependsOn這個(gè)注解。

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

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

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

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

Ccc通過@DependsOn指定依賴bean創(chuàng)建的順序?yàn)锽bb > 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類實(shí)現(xiàn)如下

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

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

除此之外,在創(chuàng)建bean時(shí),還會(huì)調(diào)用AbstractBeanFactory#registerDisposableBeanIfNecessary來向Spring中注冊(cè)帶有銷毀方法的bean,源碼見DefaultSingletonBeanRegistry#registerDisposableBean,內(nèi)部通過LinkedHashMap保存。key為bean名稱。進(jìn)程退出時(shí),會(huì)逆序調(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注解的作用及實(shí)現(xiàn)原理解析的文章就介紹到這了,更多相關(guān)Spring中@DependsOn注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java正則表達(dá)式判斷 ip 地址是否正確解析

    java正則表達(dá)式判斷 ip 地址是否正確解析

    這篇文章主要介紹了java正則表達(dá)式判斷 ip 地址是否正確解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Java的布隆過濾器你了解嗎

    Java的布隆過濾器你了解嗎

    這篇文章主要為大家詳細(xì)介紹了Java的布隆過濾器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Java實(shí)現(xiàn)TFIDF算法代碼分享

    Java實(shí)現(xiàn)TFIDF算法代碼分享

    這篇文章主要介紹了Java實(shí)現(xiàn)TFIDF算法代碼分享,對(duì)算法進(jìn)行了簡單介紹,概念,原理,以及實(shí)現(xiàn)代碼的分享,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java Spring處理循環(huán)依賴詳解

    Java Spring處理循環(huán)依賴詳解

    這篇文章主要介紹了Java中的Spring如何處理循環(huán)依賴,依賴指的是Bean與Bean之間的依賴關(guān)系,關(guān)于更多Spring?處理循環(huán)依賴的詳情,需要的朋友可以參考下面文章具體內(nèi)容
    2023-04-04
  • Mybatis 簡單啟動(dòng)過程入門詳解

    Mybatis 簡單啟動(dòng)過程入門詳解

    MyBatis是一個(gè)持久層框架,簡化JDBC操作,SpringBoot集成MyBatis,通過創(chuàng)建項(xiàng)目、準(zhǔn)備數(shù)據(jù)、配置文件、實(shí)體類和接口,可以實(shí)現(xiàn)數(shù)據(jù)庫操作,使用@Mapper和@Select注解簡化接口實(shí)現(xiàn),測試類使用@SpringBootTest和@Test注解啟動(dòng),本文介紹Mybatis啟動(dòng)過程,感興趣的朋友一起看看吧
    2025-03-03
  • javaweb登錄驗(yàn)證碼的實(shí)現(xiàn)方法

    javaweb登錄驗(yàn)證碼的實(shí)現(xiàn)方法

    這篇文章主要為大家詳細(xì)介紹了javaweb登錄驗(yàn)證碼的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Android中比較常見的Java super關(guān)鍵字

    Android中比較常見的Java super關(guān)鍵字

    這篇文章主要為大家介紹了Android中比較常見的Java super關(guān)鍵字,具有一定的學(xué)習(xí)參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 將java普通項(xiàng)目打包成exe可執(zhí)行文件的步驟記錄

    將java普通項(xiàng)目打包成exe可執(zhí)行文件的步驟記錄

    將JAVA代碼打包為exe文件,會(huì)讓程序運(yùn)行更加方便,這篇文章主要給大家介紹了關(guān)于將java普通項(xiàng)目打包成exe可執(zhí)行文件的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • IDEA maven上傳速度很慢的解決辦法

    IDEA maven上傳速度很慢的解決辦法

    maven上傳的速度很慢,排除網(wǎng)絡(luò)原因,需要檢查配置,本文主要介紹了IDEA maven上傳速度很慢的解決辦法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • SpringBoot導(dǎo)出PDF的四種實(shí)現(xiàn)方法詳解

    SpringBoot導(dǎo)出PDF的四種實(shí)現(xiàn)方法詳解

    在Spring?Boot應(yīng)用程序中實(shí)現(xiàn)PDF導(dǎo)出功能,可以選擇多種庫和技術(shù)棧,本文為大家整理了四種常見的方法,感興趣的小伙伴可以參考一下
    2025-02-02

最新評(píng)論

通道| 昆明市| 沽源县| 汕头市| 遵化市| 武强县| 晋城| 峨山| 施甸县| 老河口市| 满洲里市| 屏东县| 纳雍县| 永昌县| 甘泉县| 永登县| 上饶县| 盘锦市| 陕西省| 疏勒县| 吉木萨尔县| 铁岭县| 綦江县| 巴林左旗| 泾源县| 合江县| 安庆市| 乌海市| 罗定市| 松溪县| 怀安县| 若尔盖县| 延寿县| 绥德县| 宝山区| 荃湾区| 宜昌市| 红河县| 延吉市| 六枝特区| 东港市|