0

Spring Bean ファクトリーで循環依存関係を使用する際の落とし穴は何ですか? たとえば、Bean ファクトリ A を B に依存させ、B を A に依存させるとしますか?

4

1 に答える 1

1

セッターまたはフィールドで循環依存関係を作成する場合、実際にはそれほど問題はありません。初期化がこれらの依存関係に依存している場合、すべての Bean が構築および注入された後に init を実行する必要があります。

それらがコンストラクターによって注入された場合、結果のオブジェクトを作成することは明らかに不可能です。ただし、たとえば Guice が行うように、「シェル」プロキシを Bean の 1 つに注入することで、いずれにしても可能です。B を必要とする A を構築するとき、B の空のパススルー プロキシをハックして、それを注入します。次に、適切な A を指定して B を構築します。次に、プロキシに戻り、B をプロキシに配置します。これで、A には実際の B ではなく、B のプロキシができました。これは問題になる場合とそうでない場合があります。私はこれを嫌う傾向があり、結果が予測できないと感じています。(Bob "crazybob" Lee は、アノテーション ベースの構成 (JSR 330 になり、Spring も実装するようになりました) を使用して Guice を作成し、その選択を行い、後悔しています。)

また、循環依存は悪いアーキテクチャを指しています。円なしでコード グラフ全体を構築できるはずです。依存関係グラフは、DAG (有向非巡回グラフ) である必要があります。これに違反すると、エラーが発生するはずです。(ただし、インジェクターは明らかに DAG を整理してから、リーフ ノードから始めて上に移動する必要があります。「プロキシを使用しない」をオンにしても、Guice はそれをまったく行わないため、ランダムにプロキシを必要としない場合でも、プロキシを使用するかどうか. そして、そのオプションをオンにすると、ランダムにスローされ、オプションはまったく価値がなくなります..

于 2013-07-26T07:56:56.607 に答える