註解@AutoConfigureBefore 和 @AutoConfigureAfter的區別和作用,並舉例說明

最近在看ribbion負載均衡的源碼問題,想看一下@LoadBalanced的使用,在看源碼的時候,無意中發現@AutoConfigureBefore 和 @AutoConfigureAfter

想知道加載順序如何?

猜想

根據@AutoConfigureBefore 和 @AutoConfigureAfter兩個的字面意思就我們猜測如下:

1、使用@AutoConfigureBefore

@AutoConfigureBefore(AAAA.class)
public class CCCC {
}

猜測1:CCCC 將會在 AAAA 之前加載?!

 

2、使用@AutoConfigureAfter

@AutoConfigureAfter(BBB.class)
public class CCCC {
}

猜測2: CCCC 將會在 AAAA 之後加載?!

3、如果同時使用@AutoConfigureBefore 和 @AutoConfigureAfter這兩個註解,是不是

@AutoConfigureBefore(AAA.class)
@AutoConfigureAfter(BBB.class)
public class CCCC {
}

猜測3:執行順序是不是就是CCCC 、AAA、BBB這個順序了呢?!!!????

 

驗證

先看例子:

項目結構圖

驗證猜測1    @AutoConfigureBefore 驗證
@Configuration
public class MyConfigureBefore {

    public MyConfigureBefore(){
        System.out.println("****************************************AAAA");
        System.out.println();
    }


}

配置類

@Configuration
@Import({MyConfigureBefore.class})
@AutoConfigureBefore(MyConfigureBefore.class)
public class AppConfig1 {

    public  AppConfig1(){
        System.out.println();
        System.out.println("****************************************CCCC");
    }

}

執行結果:

結論:猜測1成立,使用@AutoConfigureBefore會優先加載當前的配置類,然後再去加載before中的配置類,

 

驗證猜測2  使用@AutoConfigureAfter驗證
@Configuration
public class MyConfigureAfter {
    public MyConfigureAfter(){
        System.out.println("********************************************************BBBB");
    }

}

配置AppConfig1代碼

@Configuration
@Import({MyConfigureAfter.class})
@AutoConfigureAfter(MyConfigureAfter.class)
public class AppConfig1 {

    public  AppConfig1(){
        System.out.println("****************************************CCCC");
    }

}

 

啓動springboot進行測試


@SpringBootApplication
@ComponentScan("com.lquan.test1.conf")
public class Test1Main {

    public static void main(String[] args) {
        SpringApplication.run(Test1Main.class, args).close();


    }

執行結果:

結論:猜測2成立, 使用@AutoConfigureAfter會優先加載當前的配置類,然後再去加載After中的配置類,

 

驗證猜測3  @AutoConfigureBefore 和 @AutoConfigureAfter同時使用執行順序如何?

配置類

@Configuration

@Import({MyConfigureAfter.class,MyConfigureBefore.class})

@AutoConfigureBefore(MyConfigureBefore.class)
@AutoConfigureAfter(MyConfigureAfter.class)
public class AppConfig1 {

    public  AppConfig1(){
        System.out.println();
        System.out.println("****************************************CCCC");
    }

}

執行結果:

這個結論和猜測3有出入,雖然都在CCCC的後面加載,但是加載順序不是先執行的@AutoConfigureBefore 的配置類,然後執行的@AutoConfigureAfter的配置類,

 

我們將AppConfig1配置類中@Import({MyConfigureAfter.class,MyConfigureBefore.class})的順序更改看一下,

將順序更改爲@Import({MyConfigureBefore.class,MyConfigureAfter.class})

配置代碼如下

@Configuration

@Import({MyConfigureAfter.class,MyConfigureBefore.class})

@AutoConfigureBefore(MyConfigureBefore.class)
@AutoConfigureAfter(MyConfigureAfter.class)
public class AppConfig1 {

    public  AppConfig1(){
        System.out.println();
        System.out.println("****************************************CCCC");
    }

}

執行結果:

 

 

最終結論

猜測1正確 和 猜測2正確,猜測3不正確,因爲,@AutoConfigureBefore 和 @AutoConfigureAfter同時使用的話,他和對應的配置文件在在使用spring ioc的加載順序有關係,

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章