全て、
依存性注入などを使用して Spring IOC コンテナーをセットアップしています。コレクション内の一部の Bean が使用前に完全に初期化され、他の Bean はそうでないという非常に奇妙な動作に遭遇しています。奇妙な点は、これらのすべての Bean が同じスーパークラスを共有し、失敗した依存性注入がスーパークラスの依存性の 1 つで発生していることです。次に例を示します。
@Component
class Bar {
void doSomething() {
// do something
}
}
class Foo {
@Autowired Bar bar
}
@Component
class FooSubclass1 extends Foo {
}
@Component
class FooSubclass2 extends Foo {
}
@Component
class FooManager implements InitializingBean {
@Autowried Collection<Foo> myFoos
void afterPropertiesSet() {
for (Foo foo : myFoo) {
foo.bar.doSomething()
}
}
}
上記のコードは、起動時に FooSubclass1 のインスタンスを反復処理するときに「doSomething」を正常に実行しますが、bar が null であるため bar.doSomething() にアクセスしようとすると FooSubclass2 のインスタンスを反復処理するときに null ポイントをスローします。
注目すべきは、起動マーカーとして InitializingBean を使用しない場合、この問題に遭遇しないことです。アプリケーションが読み込まれるのを待ってから、Foos のコレクションを反復処理すれば、すべて問題ありません。そのため、タイミングに何らかの問題があるようです - FooSubclass2 のインスタンスには Bean が作成され、コンテキストに追加されていますが、Bean が完全に注入されていません。
春についての私の理解は、特定のオブジェクトをコンテキストに追加する前に完全に作成/注入する必要があり、すべての依存関係が満たされた後にのみ AfterPropertiesSet を実行する必要があるということです。そのため、この問題のデバッグをどこから開始すればよいかよくわかりません。
いくつかのメモ: Groovy+Grails セットアップでこれを実行していますが、それが問題に関連しているとは思いません。それはすべてカバーの下のコアスプリングであり、これは明らかにスプリングレベルで起こっていることです. また、上記の例は、私の実際の例から少し馬鹿げています。数十個の DAO タイプ オブジェクトのコレクションを Autowired コレクションに挿入しています。インジェクションは、いくつかの DAO を正常に通過しますが、同じ DAO では常に失敗します。リストからそのDAOを削除すると、リストの次のDAOで失敗します。