最近在看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的加載順序有關係,