演説の前に、質問は本質的にこれに要約されると思います:
@Configuration
アプリケーションの XML ベースの構成から正しく Bean をインスタンス化するにはどうすればよいですか?
私のプロジェクトをモジュール化し、クリーンなアーキテクチャーに従う試みとして、私は 3 つのモジュールで構成されるMavenプロジェクトを作成しました。「web」モジュール、「interface」モジュール、「core」モジュールがあり、web と core の両方で Spring の Java ベースの構成が使用されます。
Web モジュールは、その POMで、コア モジュールに対する実行時依存関係と、インターフェイス モジュールに対するコンパイル時依存関係を宣言します。コア モジュールはインターフェース モジュールの実装であり、後者は Java インターフェースと DTO のみで構成されています。(これは、モジュールをインターフェースするようにプログラムする試みです。)
Web モジュールを開始するときに、コア モジュールのすべての Spring 管理 Bean が Web モジュールのアプリケーション コンテキストに認識されるようにします。次のようなコアモジュールでXMLファイルを作成することにより、これを「XML方式」で行うことに成功しました。
// This xml snippet is part of the "core" module
<beans>
<context:annotation-config />
<context:component-scan base-package="com.acme.core"/>
</beans>
...そして、次のようにWebモジュール構成でこれを参照します。
// The configuration of the "web" module
@Configuration
@ImportResource("classpath*:come/acme/configuration/spring/*.xml")
public class RootConfig {}
それは機能しますが、コアモジュールのすべての構成をJavaの方法で行う必要があるため、ソリューションに満足していません。
そのため、 Spring は次のことができると言っていることに注意してください。
...
@Configuration
クラスは、Spring XML ファイル内で通常の定義として宣言できます。
<beans>
<context:annotation-config/>
<bean class="com.acme.configuration.spring.CoreConfig"/>
</beans>
コアモジュールのXMLファイルは非常に無駄がなく、本質的には肉の構成をCoreConfig
. しかし、それは私にとってはうまくいかず、Web モジュールはコア モジュールで定義されている Bean を見つけることができません。これは、Bean がインスタンス化されている場合、別のアプリケーション コンテキストで実行されるかCoreConfig
、または でマークされている@Configuration
が特別であり、XML ファイルからこのようにインスタンス化しても他の Bean の作成がトリガーされないためであると考えられます。それは定義します。
ちなみに、XML 構成なしでこれを行う方法があればいいcom.acme.configuration.spring.AppConfig
のですが、コードにコンパイル時の依存関係がないため、Web モジュールから直接参照することはできません。(ため息) これまでのところ、モジュール化は価値があるよりも面倒であることが証明されています...