2016-09-15 14 views
1

私の自動設定が正しく動作するようにするために問題があります。私は次の2つのjarを持っています。それぞれにspring.factoriesファイルがあり、この2つがEnableAutoConfigurationPropertiesに対して有効になっています。外部依存からSpringブートの自動構成の順序

この構成では、私のパッケージ-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が含まれていれば、Aが前回と同じように命じられ、B MyServiceが既に定義されているため、AutoConfigurationBは処理されないということです。 ただし、これらのjarを含む3番目のプロジェクトで使用すると機能しません。 AutoConfigureOrderアノテーションは、クラスパスからこれらのjarsをロードするときにスキップされ、これらの設定は、jvmがこれらのクラスをロードする順序で処理されるようです。私の特別なケースでは、まずBを行い、その時点でMyServiceはまだ定義されていないため、RealService Beanをインスタンス化します。これをどのように機能させることができますか?

明らかに、これは、モックの@Primaryアノテーションがジョブを実行する小さな例ですが、それは私が探しているものではありません。

編集:@SpringBootApplicationに注釈が付けられたメインがパッケージの一部ではなく、これらの設定が動作しているようです。例えば。注釈は "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

ありがとうAndy、それは本当に私の問題を解決しました。奇妙な考えは、両方のコンフィグレーションクラスと@SpringBootApplicationが(別のプロジェクトの依存関係のジャーとしてではなく)自分自身で使用されている場合、正しく動作するということでした。私はそれがちょうど運が良かったのか、その場合は春の靴が違うかどうかはわかりません。 Eithee way、答えは受け入れました。ありがとう! –

関連する問題