0

次のような2つのクラスがある場合:

Class A {
     public String importantValue = "stringvalue";

     @Autowire
     public B b;
}

@Component
@Scope("prototype");
Class B {
     // This should be set automatically
     // from IOC Container upon injection.
     public String importantValueFromA;
}

これは可能ですか?B クラスが A に注入されるとすぐに、B に値が自動的に設定されます。

4

3 に答える 3

5

A注入されたクラスでクラスにセットアップを行いますかB? それは簡単です:

@Service
class A {
    private String importantValue = "stringvalue";

    @Autowire
    private B b;

    @PostConstruct
    public void initB() {
        b.importantValueFromA = this.importantValue;
    }
}

インジェクションがまだ行われていないため、明らかb.importantValueFromAにコンストラクターでアクセスできません。A.Aただし、@PostConstructコールバックはインジェクション後に呼び出されることが保証されています。

もう 1 つのアプローチは、setter インジェクションを使用することですが、ちょっとハックな感じがします。

private B b;

@Autowire
public void setB(B b) {
    this.b = b;
    b.importantValueFromA = this.importantValue;
}

2 つの提案:

  • フィールドprivateを保持し、セッター/メソッドを使用してそれらにアクセスします。
  • プロトタイプ スコープ Bean をシングルトン Bean に注入すると、予期しない結果が生じる可能性があります。のインスタンスが 1 つだけB作成されると言っても過言ではありません。
于 2012-08-19T14:40:24.420 に答える
0

B は A の前に作成されるため (A は B に依存するため)、値自体は更新されません。コンストラクター インジェクションを使用する必要があります。

Class A {
     public String importantValue = "stringvalue";

     @Autowire
     public A(B b) {
          b.importantValueFromA = this.importantValue;
     }
}
于 2012-08-19T14:39:49.097 に答える
0

次のようにしてみてはどうでしょうか。

クラス B をスコープ付きプロキシとして宣言します。このプロキシは、実際の B ではなく A にプロキシを公開し、プロトタイプ スコープを尊重します。

@Component
@Scope(value="prototype", proxyMode=ScopedProxyMode.TARGET_CLASS)
class B {

次に、次の方法で B に A の属性を挿入できます。

@Value("#{a.importantValue}")
private String importantValueFromA;

要旨の完全な動作例を次に示します。

https://gist.github.com/3395329

于 2012-08-19T15:00:52.430 に答える