2016-09-15 153 views
1

我有一個問題,試圖讓我的自動配置工作。我有兩個罐子,如下所示,每個罐子都有一個spring.factories文件,其中這兩個啓用了EnableAutoConfigurationProperties。從外部依賴性彈簧啓動自動配置順序

這種配置在我的包,mock.jar,這取決於下面我 - 封裝 - real.jar:

package org.packages.package.packageA; 
@Configuration 
@AutoConfigureBefore(AutoConfigurationB.class) 
public class AutoConfigurationA { 

    @Bean 
    public MyService mockService() { 
     return new MyMockService(); 
    } 
} 

這種配置在我的包,real.jar:

package org.packages.package.packageB; 
@Configuration 
@ConditionalOnMissingBean(MyService.class) 
public class AutoConfigurationB { 

    @Bean 
    public MyService realService() { 
     return new MyRealService(); 
    } 
} 

現在的想法是,如果包含my-package-mock.jar,那麼AutoConfigurationB將不會被處理,因爲A被命令在之前,並且到達B的時候MyService已經被定義。 但是,它在包含這些罐子的第三個項目中使用時不起作用。當從類路徑加載這些jar時,它看起來像AutoConfigureOrder註釋被跳過,並且這些配置按照jvm加載這些類的順序進行處理。在我的特殊情況下,它首先執行B,此時MyService尚未定義,因此將實例化RealService Bean。我怎樣才能使這個工作?

很明顯,這是一個小例子,模擬上的@Primary註釋可以完成這項工作,但這不是我正在尋找的。

編輯:如果@SpringBootApplication帶註釋的main不是包含這些配置的包的一部分,那麼這些配置就可以工作。例如。註解不在「org.packages.package」中,而是「org.somewhereelse」,那麼事情就會起作用。

package org.packages.package; 

@SpringBootApplication 
public class TestApplication { 

    public static void main(String[] args) throws Exception { 
    SpringApplication.run(Collections.singletonList(TestApplication.class).toArray(), args); 
    } 
} 

回答

0

@AutoConfigureBefore@AutoConfigureAfter只適用於當一個配置類加載過程中自動配置的結果被啓用,它spring.factories被列。當您的自動配置類位於org.packages.package(或子包)中,並且您的主要應用程序類位於同一個包中時,Spring Framework的標準組件掃描會發現它們。發生這種情況是因爲@SpringBootApplication爲其註釋的類的包啓用了組件掃描。由於這個原因,自動配置特定的順序不適用。

爲了避免這個問題,您應該將自動配置類放入一個未被任何應用程序代碼使用的包中。

+0

謝謝安迪,那確實解決了我的問題。奇怪的想法是,當它們自己使用的配置類和@SpringBootApplication(例如,不是作爲另一個項目中的依賴關係jar)都能正常工作時。我不知道這是否只是運氣,或者那種情況下彈簧引導的行爲不同。 Eithee的方式,答案接受。謝謝! –