1

私が持っている場合:

@Component
class Foo {

    @Autowired      
    private Bar b; //where b is @Service

     public Foo(){          
        //if i need to use b here, what do i need to do?
        b.something(); // <-- b is null so it'll crash here
    }

    public void setB(Bar b){
        this.b = b;
    }
}

Spring docs を読むと、コンストラクター ベースのインジェクションよりもセッター ベースのインジェクション メソッドが推奨されることがわかりますが、上記の例では、現在のクラスのコンストラクター内で注入されたスプリング クラスを使用する必要があるため、コンストラクター ベースのインジェクションである必要がありますか?

もしそうなら、これはどのように見えるでしょうか?

@Component
class Foo {

    private Bar b; //where b is @Service

    @Autowired
     public Foo(Bar b){
        b.something(); // b won't be null now !
    }
}
4

3 に答える 3

0

コードは機能します。はい、@Autowired を使用してコンストラクター パラメーターを配線できます。

セッター注入を行ってから init-method を宣言するか、@PostConstruct を使用して Bean を初期化することもできます。

于 2012-11-04T08:20:33.033 に答える
0

次のように、application-context.xml (または同等の Spring 構成ファイル) で Bean を定義する必要があります。

<bean id="b" class="Bar" />
<bean id="f" class="Foo">
    <constructor-arg ref="b" />
</bean>

@Componentそして、それらと@Autowired注釈を Foo クラスから削除するだけです。@Componentコンポーネントのスキャン中にデフォルトのコンストラクターを見つけようとし、Bean の作成プロセスに失敗します。

于 2012-11-03T05:43:02.983 に答える
0

すでに述べたように、@PostConstruct でアノテーションを付けたメソッドを作成できます: http://www.mkyong.com/spring/spring-postconstruct-and-predestroy-example/ これには、追加の依存関係といくつかの構成が必要です。

必要なことを行う通常の方法は、Bean に Spring インターフェースを実装させることですInitializingBeanafterPropertiesSet()実装できるメソッドは、すべての依存関係が注入された後、Spring によってトリガーされます。

アノテーションを使用することをお勧めします。一度構成すると、よりシンプルで読みやすく、Java EE と互換性があります。

于 2012-11-04T12:09:07.393 に答える