我想知道是否可以在构造函数上使用@Resource
注释。
我的用例是我要连接一个名为bar
的最终字段。
public class Foo implements FooBar {
private final Bar bar;
@javax.annotation.Resource(name="myname")
public Foo(Bar bar) {
this.bar = bar;
}
}
我收到一条消息,指出此位置不允许@Resource
。有没有其他方法可以连接最后一个字段?
答案 0 :(得分:18)
来自@Resource
的来源:
@Target({TYPE, FIELD, METHOD})
@Retention(RUNTIME)
public @interface Resource {
//...
}
这一行:
@Target({TYPE, FIELD, METHOD})
表示此注释只能放在类,字段和方法上。 CONSTRUCTOR
遗失了。
答案 1 :(得分:9)
使用@Autowired
或@Inject
。 Spring 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。