亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

本文給大家講解Spring中@DependsOn注解的作用及實現(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
該注解的屬性是一個字符串?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.InitializingBean
org.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,從而達(dá)到控制依賴順序。

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

相關(guān)文章

  • MyBatis-Plus的物理刪除和邏輯刪除(使用場景)

    MyBatis-Plus的物理刪除和邏輯刪除(使用場景)

    數(shù)據(jù)庫中的數(shù)據(jù)刪除會分為兩種:物理刪除 和 邏輯刪除,接下來通過本文給大家介紹MyBatis-Plus的物理刪除和邏輯刪除使用場景分析,感興趣的朋友一起看看吧
    2021-09-09
  • Java中枚舉的實現(xiàn)與應(yīng)用詳解

    Java中枚舉的實現(xiàn)與應(yīng)用詳解

    這篇文章主要介紹了Java中枚舉的實現(xiàn)與應(yīng)用詳解,EnumTest中還有一個VALUES數(shù)組,里面存儲著所有的枚舉實例,調(diào)用values方法時返回VALUES數(shù)組的clone,需要的朋友可以參考下
    2023-12-12
  • Java中一些常見的并發(fā)集合類的使用

    Java中一些常見的并發(fā)集合類的使用

    并發(fā)集合是一種特殊的數(shù)據(jù)結(jié)構(gòu),它允許多個線程安全地訪問和修改,本文主要介紹了Java中一些常見的并發(fā)集合類的使用,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • java上界通配符(? extends Type)的使用

    java上界通配符(? extends Type)的使用

    在Java中,? extends Type是一個上界通配符,本文主要介紹了java上界通配符(? extends Type)的使用,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • 詳解spring中使用solr的代碼實現(xiàn)

    詳解spring中使用solr的代碼實現(xiàn)

    本篇文章主要介紹了詳解spring中使用solr的代碼實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java EasyExcel導(dǎo)出報內(nèi)存溢出的解決辦法

    Java EasyExcel導(dǎo)出報內(nèi)存溢出的解決辦法

    使用EasyExcel進(jìn)行大數(shù)據(jù)量導(dǎo)出時容易導(dǎo)致內(nèi)存溢出,特別是在導(dǎo)出百萬級別的數(shù)據(jù)時,你有遇到過這種情況嗎,以下是小編整理的解決該問題的一些常見方法,需要的朋友可以參考下
    2024-10-10
  • Spring?Boot獲取resources目錄下的文件三種方式詳解

    Spring?Boot獲取resources目錄下的文件三種方式詳解

    在Spring?Boot項目中,經(jīng)常需要獲取resources目錄下的文件,這些文件可以包括配置文件、模板文件、靜態(tài)資源等,這篇文章主要介紹了Spring?Boot獲取resources目錄下的文件的三種方式,需要的朋友可以參考下
    2023-06-06
  • idea中的jvm調(diào)優(yōu)方式

    idea中的jvm調(diào)優(yōu)方式

    這篇文章主要介紹了idea中的jvm調(diào)優(yōu)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 關(guān)于idea-web.xml版本過低怎么生成新的(web.xml報錯)問題

    關(guān)于idea-web.xml版本過低怎么生成新的(web.xml報錯)問題

    今天通過本文給大家分享idea-web.xml版本過低怎么生成新的(web.xml報錯)問題,通過更換web.xml版本解決此問題,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • Java實現(xiàn)爬取百度圖片的方法分析

    Java實現(xiàn)爬取百度圖片的方法分析

    這篇文章主要介紹了Java實現(xiàn)爬取百度圖片的方法,結(jié)合實例形式分析了java基于jsonp爬取百度圖片的相關(guān)原理、操作技巧與注意事項,需要的朋友可以參考下
    2018-12-12

最新評論