是否可以在构造函数上使用@Resource?

时间:2011-04-29 10:57:41

标签: java spring autowired spring-annotations

我想知道是否可以在构造函数上使用@Resource注释。

我的用例是我要连接一个名为bar的最终字段。

public class Foo implements FooBar {

    private final Bar bar;

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

我收到一条消息,指出此位置不允许@Resource。有没有其他方法可以连接最后一个字段?

3 个答案:

答案 0 :(得分:18)

来自@Resource的来源:

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

这一行:

@Target({TYPE, FIELD, METHOD})

表示此注释只能放在类,字段和方法上。 CONSTRUCTOR遗失了。

答案 1 :(得分:9)

使用@Autowired@InjectSpring reference documentation: Fine-tuning annotation-based autowiring with qualifiers

中介绍了此限制
  

@Autowired适用于字段,构造函数和多参数方法,允许在参数级别缩小限定符注释。相比之下,@ Resource仅支持具有单个参数的字段和bean属性setter方法。因此,如果您的注射目标是构造函数或多参数方法,请坚持使用限定符。

答案 2 :(得分:8)

为了补充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的bean,所以Spring知道要使用哪个),而baz有一个限定符来告诉Spring哪个特定的我们想要注入的那个类的bean。