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

Spring注解@DependsOn解析

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

介紹

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

注解詳情

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

@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的名稱,如果沒有對(duì)bean設(shè)置名稱,那么就為首字母為小寫的類名。

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

}

源碼解析

spring掃描到所有的標(biāo)有@Component(@Service,@Repository等注解本質(zhì)就是@Component)的類和標(biāo)有@Bean的方法后,會(huì)進(jìn)行處理,這里,它會(huì)判斷是否標(biāo)注有@DependsOn,如果標(biāo)注有,則會(huì)設(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"));
		}
	}

上面是在注冊(cè)bean元數(shù)據(jù)階段,注冊(cè)元數(shù)據(jù)階段只是組裝好bean之間的依賴,然后在真正創(chuàng)建bean的時(shí)候,才會(huì)進(jìn)行判斷,如下在AbstractBeanFactory類中的doGetBean中,會(huì)從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);
                }
            }
        }
    }

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

總結(jié)

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

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

相關(guān)文章

  • Java使用itext5實(shí)現(xiàn)PDF表格文檔導(dǎo)出

    Java使用itext5實(shí)現(xiàn)PDF表格文檔導(dǎo)出

    這篇文章主要介紹了Java使用itext5實(shí)現(xiàn)PDF表格文檔導(dǎo)出,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • java核心編程之文件過濾類FileFilter和FilenameFilter

    java核心編程之文件過濾類FileFilter和FilenameFilter

    這篇文章主要為大家詳細(xì)介紹了java文件過濾類FileFilter和FilenameFilter,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • IDEA上運(yùn)行Flink任務(wù)的實(shí)戰(zhàn)教程

    IDEA上運(yùn)行Flink任務(wù)的實(shí)戰(zhàn)教程

    這篇文章主要介紹了IDEA上運(yùn)行Flink任務(wù)的實(shí)戰(zhàn)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • springboot實(shí)現(xiàn)敏感字段加密存儲(chǔ)解密顯示功能

    springboot實(shí)現(xiàn)敏感字段加密存儲(chǔ)解密顯示功能

    這篇文章主要介紹了springboot實(shí)現(xiàn)敏感字段加密存儲(chǔ),解密顯示,通過mybatis,自定義注解+AOP切面,Base64加解密方式實(shí)現(xiàn)功能,本文通過代碼實(shí)現(xiàn)給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • 詳解Java實(shí)現(xiàn)緩存(LRU,FIFO)

    詳解Java實(shí)現(xiàn)緩存(LRU,FIFO)

    本篇文章主要介紹了詳解Java實(shí)現(xiàn)緩存(LRU,FIFO) ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • SpringBoot配置shiro安全框架的實(shí)現(xiàn)

    SpringBoot配置shiro安全框架的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot配置shiro安全框架的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 淺談Java響應(yīng)式系統(tǒng)

    淺談Java響應(yīng)式系統(tǒng)

    第一次聽到reactive這個(gè)詞還是在幾年前,偶然了解到了Rxjava這個(gè)項(xiàng)目,仿佛為我打開了一扇新的大門,Rxjava是ReactiveX的java實(shí)現(xiàn),ReactiveX家族除了Rxjava還有RxJS, Rx.NET,RxScala等等。
    2021-06-06
  • Golang Protocol Buffer案例詳解

    Golang Protocol Buffer案例詳解

    這篇文章主要介紹了Golang Protocol Buffer案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java快速掌握Vector類方法

    Java快速掌握Vector類方法

    Vector?類實(shí)現(xiàn)了一個(gè)動(dòng)態(tài)數(shù)組。和?ArrayList?很相似,但是兩者是不同的:Vector?是同步訪問的;Vector?包含了許多傳統(tǒng)的方法,這些方法不屬于集合框架
    2022-03-03
  • java中對(duì)Redis的緩存進(jìn)行操作的示例代碼

    java中對(duì)Redis的緩存進(jìn)行操作的示例代碼

    本篇文章主要介紹了java中對(duì)Redis的緩存進(jìn)行操作的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-08-08

最新評(píng)論

偃师市| 繁昌县| 布尔津县| 阳曲县| 广东省| 南汇区| 乌兰浩特市| 衡水市| 开封县| 桑植县| 尚义县| 龙川县| 吉隆县| SHOW| 新蔡县| 鹤壁市| 关岭| 正安县| 信阳市| 长海县| 镇康县| 崇仁县| 宣化县| 石渠县| 明水县| 永宁县| 乐安县| 敖汉旗| 噶尔县| 石家庄市| 从化市| 澄城县| 南昌市| 买车| 仙桃市| 宁蒗| 公主岭市| 蛟河市| 岑溪市| 特克斯县| 佛学|