注釈ベースの構成で最新の Spring 3 規則を使用しようとしているアプリがありますが、コンストラクター注入を使用するレガシー クラスもあります。Spring のドキュメントに基づいて、その依存関係を作成するメソッドを呼び出して、それを必要とするコンストラクターに渡すだけです。Configuration クラスが拡張されている場合は機能するようですが、Configuration クラスを @Import すると拡張されないため、自動配線されていないインスタンスを挿入する可能性があるようです。
具体的には、私のリポジトリの 1 つがコンストラクターによって別の Bean に注入され、そのリポジトリが他の Bean と同じ構成クラスで定義されている場合 (リポジトリは独自の構成クラスにある必要があることはわかっています)、注入されたものとは配線されません。エンティティマネージャー。
私の豆:
public class MyBean {
private ShouldBeSingleton d;
public @Autowired MyBean(ShouldBeSingleton d) { this.d = d; }
public ShouldBeSingleton getMyDependency() { return d; }
}
public class ShouldBeSingleton {
}
そして、次のような 2 つの構成クラス:
@Configuration
public class MyImportedConfig {
@Bean public ShouldBeSingleton mySingleton() {
return new ShouldBeSingleton();
}
@Bean public MyBean myBean() {
return new MyBean(mySingleton());
}
}
@Configuration
@Import({MyImportedConfig.class})
public class MyConfig {
}
私のメインは次のようになります。
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
MyBean bean = context.getBean(MyBean.class);
System.out.println("myInjectedSingleton=" + bean.getMyDependency());
System.out.println("mySingleton=" + context.getBean(ShouldBeSingleton.class));
}
MyImportedConfig.class をロードすると、正しい出力が得られます (つまり、MyImportedConfig 内からメソッドを呼び出した場合、シングルトン クラスは同じです)。
myInjectedSingleton=test.ShouldBeSingleton@b42cbf
mySingleton=test.ShouldBeSingleton@b42cbf
しかし、AnnotationConfigApplicationContext を変更して、MyImportedConfig をインポートする MyConfig をロードすると、次のようになります。
myInjectedSingleton=test.ShouldBeSingleton@a9ae05
mySingleton=test.ShouldBeSingleton@1dff3a2
これは予想される動作ですか?私の現在の回避策は、EntityManager を別の Configuration クラスに注入する必要があるものをすべて移動し、それをインポートしてから、Configuration クラスにコンストラクター注入が必要な @Autowired 依存関係を設定することです。
これを AnnotationConfigWebApplicationContext にロードしています。contextConfigLocation で各構成クラスを指定すると、すべての構成クラスが適切に拡張されますが、これは「モジュラー」@Import 機能を使用していないようです。