19

@Resourceコンストラクターでアノテーションを使用できるかどうか疑問に思っていました。

私のユースケースは、という最終フィールドを配線したいということですbar

public class Foo implements FooBar {

    private final Bar bar;

    @javax.annotation.Resource(name="myname")
    public Foo(Bar bar) {
        this.bar = bar;
    }
}

@Resourceこの場所では許可されていないというメッセージが表示されます。最終フィールドを配線できる他の方法はありますか?

4

3 に答える 3

24

のソースから@Resource:

@Target({TYPE, FIELD, METHOD})
@Retention(RUNTIME)
public @interface Resource {
    //...
}

この行:

@Target({TYPE, FIELD, METHOD})

この注釈は、クラス、フィールド、およびメソッドにのみ配置できることを意味します。CONSTRUCTOR不足している。

于 2011-04-29T11:07:44.987 に答える
11

Robert Munteanuの回答を補完し、将来の参考のために、コンストラクターの使用@Autowired@Qualifierコンストラクターの使用方法を次に示します。

public class FooImpl implements Foo {

    private final Bar bar;

    private final Baz baz;

    @org.springframework.beans.factory.annotation.Autowired
    public Foo(Bar bar, @org.springframework.beans.factory.annotation.Qualifier("thisBazInParticular") Baz baz) {
        this.bar = bar;
        this.baz = baz;
    }
}

この例では、barは自動配線されているだけです (つまり、コンテキスト内にそのクラスの Bean が 1 つしかないため、Spring はどれを使用するかを認識しています) が、bazそのクラスのどの特定の Bean を注入するかを Spring に伝える修飾子があります。

于 2016-09-16T14:02:04.487 に答える
9

@Autowiredまたはを使用し@Injectます。この制限は、Spring リファレンス ドキュメントで説明されています: Fine-tuning annotation-based autowiring with qualifiers :

@Autowired は、フィールド、コンストラクター、および複数引数のメソッドに適用され、パラメーター レベルで修飾子アノテーションを絞り込むことができます。対照的に、@Resource は、単一の引数を持つフィールドおよび Bean プロパティ セッター メソッドに対してのみサポートされます。結果として、注入ターゲットがコンストラクターまたは複数引数のメソッドである場合は、修飾子を使用してください。

于 2011-04-29T11:01:02.590 に答える