欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring注解@DependsOn解析

 更新時間:2023年04月23日 11:21:59   作者:劉牌  
今天要分享得是Spring的@DependsOn注解,對于@DependsOn,我們從它的名稱里面就能看出意思是“依賴于”,那么在Spring中,它的作用就是解決Bean的創(chuàng)建依賴,感興趣的小伙伴快來閱讀吧

介紹

今天要分享得是Spring的@DependsOn注解,對于@DependsOn,我們從它的名稱里面就能看出意思是“依賴于”,那么在Spring中,它的作用就是解決Bean的創(chuàng)建依賴,比如某個Bean在創(chuàng)建的時候依賴另外一個bean,所以需要另外一個bean先創(chuàng)建,然后再創(chuàng)建自己。

注解詳情

@DependsOn注解可以標(biāo)注在類上和方法上面,只有一個屬性value,它是一個數(shù)組,表示依賴的bean名稱的數(shù)組,可以指定一個或者多個。

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DependsOn {

	String[] value() default {};

使用

如下,在DependsOnBeanA上標(biāo)注了@DependsOn注解,那么DependsOnBeanA需要在Bean dependsOnBeanB創(chuàng)建完成之后才能創(chuàng)建自己,這里value的值為bean的名稱,如果沒有對bean設(shè)置名稱,那么就為首字母為小寫的類名。

@Component
@DependsOn(value = {"dependsOnBeanB"})
public class DependsOnBeanA {

}

源碼解析

spring掃描到所有的標(biāo)有@Component(@Service,@Repository等注解本質(zhì)就是@Component)的類和標(biāo)有@Bean的方法后,會進(jìn)行處理,這里,它會判斷是否標(biāo)注有@DependsOn,如果標(biāo)注有,則會設(shè)置BeanDefinition的dependsOn,設(shè)置其依賴的bean,如下在AnnotationConfigUtils注解工具類中源碼如下。

static void processCommonDefinitionAnnotations(AnnotatedBeanDefinition abd, AnnotatedTypeMetadata metadata) {
    //省略若干代碼
		AnnotationAttributes dependsOn = attributesFor(metadata, DependsOn.class);
		if (dependsOn != null) {
			  abd.setDependsOn(dependsOn.getStringArray("value"));
		}
	}

上面是在注冊bean元數(shù)據(jù)階段,注冊元數(shù)據(jù)階段只是組裝好bean之間的依賴,然后在真正創(chuàng)建bean的時候,才會進(jìn)行判斷,如下在AbstractBeanFactory類中的doGetBean中,會從RootBeanDefinition中取出dependsOn的值,不為空則進(jìn)行bean的創(chuàng)建,創(chuàng)建bean的過程和其他bean的創(chuàng)建過程也是一樣的。

 protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
            throws BeansException {
        RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
        // Guarantee initialization of beans that the current bean depends on.
        String[] dependsOn = mbd.getDependsOn();
        if (dependsOn != null) {
            for (String dep : dependsOn) {
                if (isDependent(beanName, dep)) {
                    throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                            "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
                }
                    registerDependentBean(dep, beanName);
                try {
                    getBean(dep);
                } catch (NoSuchBeanDefinitionException ex) {
                    throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                            "'" + beanName + "' depends on missing bean '" + dep + "'", ex);
                }
            }
        }
    }

從上面可以看出,其實還是比較簡單,主要就是判斷是否有依賴的bean,如果有就先創(chuàng)建依賴的bean,沒有的話就往下執(zhí)行。

總結(jié)

上面我們對@DependsOn作了簡單的介紹,對其的使用方法進(jìn)行簡單示例,也對核心源碼進(jìn)行分析,還是比較簡單,他們都是bean創(chuàng)建過程中的一些增強,spring的創(chuàng)建過程還是比較簡單,但是就是因為它的功能點比較多,所以在創(chuàng)建過程中會有各種擴展,各種判斷,所以就會變得很復(fù)雜,不過它的主線還是比較清晰的,在進(jìn)行分析的時候,可以先從主線進(jìn)行分析,然后再慢慢去看主線分出去的邏輯。

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

相關(guān)文章

  • Netty分布式獲取異線程釋放對象源碼剖析

    Netty分布式獲取異線程釋放對象源碼剖析

    這篇文章主要為大家介紹了Netty分布式獲取異線程釋放的對象源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-03-03
  • Java深入探索線程安全和線程通信的特性

    Java深入探索線程安全和線程通信的特性

    這篇文章主要介紹了Java線程安全和線程通信的特性,線程安全是多線程編程時的計算機程序代碼中的一個概念。在擁有共享數(shù)據(jù)的多條線程并行執(zhí)行的程序中,線程安全的代碼會通過同步機制保證各個線程都可以正常且正確的執(zhí)行,不會出現(xiàn)數(shù)據(jù)污染等意外情況
    2022-05-05
  • java實現(xiàn)圖片任意角度旋轉(zhuǎn)

    java實現(xiàn)圖片任意角度旋轉(zhuǎn)

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)圖片任意角度旋轉(zhuǎn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Apache Calcite進(jìn)行SQL解析(java代碼實例)

    Apache Calcite進(jìn)行SQL解析(java代碼實例)

    Calcite是一款開源SQL解析工具, 可以將各種SQL語句解析成抽象語法樹AST(Abstract Syntax Tree), 之后通過操作AST就可以把SQL中所要表達(dá)的算法與關(guān)系體現(xiàn)在具體代碼之中,今天通過代碼實例給大家介紹Apache Calcite進(jìn)行SQL解析問題,感興趣的朋友一起看看吧
    2022-01-01
  • Mybatis查詢返回Map<String,Object>類型的實現(xiàn)

    Mybatis查詢返回Map<String,Object>類型的實現(xiàn)

    本文主要介紹了Mybatis查詢返回Map<String,Object>類型的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 23種設(shè)計模式(17)java命令模式

    23種設(shè)計模式(17)java命令模式

    這篇文章主要為大家詳細(xì)介紹了23種設(shè)計模式之java命令模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • java編程簡單獲取圖片像素的方法

    java編程簡單獲取圖片像素的方法

    這篇文章主要介紹了java編程簡單獲取圖片像素的方法,涉及Java針對圖片的讀取與屬性獲取技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • zookeeper集群搭建超詳細(xì)過程

    zookeeper集群搭建超詳細(xì)過程

    這篇文章主要介紹了zookeeper集群搭建超詳細(xì)過程,本文對zookeeper集群測試通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Windows下apache ant安裝、環(huán)境變量配置教程

    Windows下apache ant安裝、環(huán)境變量配置教程

    這篇文章主要介紹了Windows下apache ant安裝、環(huán)境變量配置教程,ANT的安裝很簡單,本文同時講解了驗證安裝是否成功的方法和使用方法實例,需要的朋友可以參考下
    2015-06-06
  • 構(gòu)建多模塊的Spring Boot項目步驟全紀(jì)錄

    構(gòu)建多模塊的Spring Boot項目步驟全紀(jì)錄

    這篇文章主要給大家介紹了關(guān)于如何構(gòu)建多模塊的Spring Boot項目的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05

最新評論