2009-07-24 9 views
0

基本的には、クラスBに依存するクラスBを持っていますが、これはスプリングマネージドBean Cに依存しますが、何らかの理由でBをクラス変数として使用したい。私の解決策は、Bのインスタンスを返す静的メソッドget()をBに作成することです。問題はCが正しくBに注入されないことです。Springはこのユーザー・ケースを処理できますか?プロパティやコンストラクタの注入はありません

// A cannot have B as a class/field variable. 

public class A { 
    public void method(){ 
     // B.get() returns a instance of B, but this instance is not the 
     // instance that spring created, it is the static "instance" in B. 

     B.get().doSomething();// ofcourse it throws out a nullpointer exception 
    } 
} 

class B{ 
    @Resource(name = "c") 
    private C c; 

    private static B instance; 


    public static B get() { 
     return instance==null ? (instance=new B()) : instance; 
    } 

    public void doSomething(){ 
     c.toString();  // this line will break if c is not 
          // injected to the instance of b 
    } 
} 

@Service("c") 
class C {    
} 

この問題を解決するにはどうすればよいですか?

+0

なぜBをAに注射することができないのですか?それはそれを行う最も正しい、「春」の方法です。回避策を見つけるのではなく、根本的な問題を解決しようとします。 –

答えて

0

ApplicationContextからA#method()の中か、Aのコンストラクタまたはその初期化メソッドでプログラムでBeanを取得し、Spring注入Bインスタンスをキャッシュする必要があります。

2

春を使用しての全体のポイントは、それが依存性注入フレームワークであり、あなたはそれを行うにはない非常に難しい試してみてくださいA.

をBの依存性をハードコーディングされています。インスタンス変数にBを格納したくない場合は、それをメソッドの引数として渡します。

あなたが頑張っているなら、ApplicationContextを取得して自分でロードする必要があります。別の方法として、BにInitializingBeanを実装させ、afterPropertiesSetメソッドに静的インスタンス変数を使用して現在のインスタンスを登録させることがあります。

+0

ApplicationContextを取得するには、ApplicationContextAwareインターフェイスを実装する方法があります。 –

1

これをサポートするためのスプリングの直接のビットはありませんが、問題を解決するためにはいくつかの回避策があります。それは一般的にどこにも静的に保持されていないよう

  1. B.get中のApplicationContext(の

    グラブホールド)とのApplicationContextのホールドを取得B.を構築するために、スプリングを取得するためにgetBeanを呼び出すには、もう一つの使命である、顔をしています「汚いシングルトン」

  2. 用スプリングのリファレンスマニュアルでスプリングは、Beanを構築した後、インスタンス変数にそれへの参照を保持してみましょう:

@Service(「B」) クラスB { @Resource(name = "c") プライベートC c;私は2は、様々なプロジェクトに数回使用し、それはかなりありません、あなたは選択肢を持っている場合は、全体のアプリを配線するだけで取得春、それをしない見てきました

private static B instance; 

public B(){ 
    // sets the static here 
    // not ideal...should use afterProperties set or what ever the Annotation equivalent is 
    instance = this; 
} 

public static B get() { 
    if(instance == null){ 
      throw new IllegalStateException("errr...say something useful here") 
    } 
    return instance; 
} 

public void doSomething(){ 
    c.toString();  // this line will break if c is not 
         // injected to the instance of b 
} 

}

。しかし、選択肢がなければ、最悪の選択肢ではないかもしれません。

関連する問題