如何通过注释在 Spring 中按名称自动装配?
How to autowire by name in Spring with annotations?
我定义了几个相同 class 的 bean:
@Bean
public FieldDescriptor fullSpotField() {
FieldDescriptor ans = new FieldDescriptor("full_spot", String.class);
return ans;
}
@Bean
public FieldDescriptor annotationIdField() {
FieldDescriptor ans = new FieldDescriptor("annotationID", Integer.class);
return ans;
}
因此当我自动装配它们时
@Autowired
public FieldDescriptor fullSpotField;
@Autowired
public FieldDescriptor annotationIdField;
我遇到异常
NoUniqueBeanDefinitionException: No qualifying bean of type [...FieldDescriptor] is defined: expected single matching bean but found ...
如何在 XML 配置中尽可能按名称自动装配?
可以用@Qualifier
来解决
在您的情况下,您可以:
@Bean(name="fullSpot")
// Not mandatory. If not specified, it takes the method name i.e., "fullSpotField" as qualifier name.
public FieldDescriptor fullSpotField() {
FieldDescriptor ans = new FieldDescriptor("full_spot", String.class);
return ans;
}
@Bean("annotationIdSpot")
// Same as above comment.
public FieldDescriptor annotationIdField() {
FieldDescriptor ans = new FieldDescriptor("annotationID", Integer.class);
return ans;
}
随后您可以使用以下方式注入:
@Autowired
@Qualifier("fullSpot")
public FieldDescriptor fullSpotField;
@Autowired
@Qualifier("annotationIdSpot")
public FieldDescriptor annotationIdField;
这是一个非常简单的“按名称自动装配”的例子
beans 自己注册到容器中,但在按名称使用自动装配时可能需要构造函数注入。
你可以继续这样试试,
你在哪里自动装配上面指定的 2 个 bean,
class ExampleClass {
@Autowired
public FieldDescriptor fullSpotField;
@Autowired
public FieldDescriptor annotationIdField;
public ExampleClass(FieldDescriptor fullSpotField,FieldDescriptor annotationIdField ){
super();
this.fullSpotField = fullSpotField;
this.annotationIdField = annotationIdField;
}
}
我定义了几个相同 class 的 bean:
@Bean
public FieldDescriptor fullSpotField() {
FieldDescriptor ans = new FieldDescriptor("full_spot", String.class);
return ans;
}
@Bean
public FieldDescriptor annotationIdField() {
FieldDescriptor ans = new FieldDescriptor("annotationID", Integer.class);
return ans;
}
因此当我自动装配它们时
@Autowired
public FieldDescriptor fullSpotField;
@Autowired
public FieldDescriptor annotationIdField;
我遇到异常
NoUniqueBeanDefinitionException: No qualifying bean of type [...FieldDescriptor] is defined: expected single matching bean but found ...
如何在 XML 配置中尽可能按名称自动装配?
可以用@Qualifier
来解决
在您的情况下,您可以:
@Bean(name="fullSpot")
// Not mandatory. If not specified, it takes the method name i.e., "fullSpotField" as qualifier name.
public FieldDescriptor fullSpotField() {
FieldDescriptor ans = new FieldDescriptor("full_spot", String.class);
return ans;
}
@Bean("annotationIdSpot")
// Same as above comment.
public FieldDescriptor annotationIdField() {
FieldDescriptor ans = new FieldDescriptor("annotationID", Integer.class);
return ans;
}
随后您可以使用以下方式注入:
@Autowired
@Qualifier("fullSpot")
public FieldDescriptor fullSpotField;
@Autowired
@Qualifier("annotationIdSpot")
public FieldDescriptor annotationIdField;
这是一个非常简单的“按名称自动装配”的例子 beans 自己注册到容器中,但在按名称使用自动装配时可能需要构造函数注入。
你可以继续这样试试, 你在哪里自动装配上面指定的 2 个 bean,
class ExampleClass {
@Autowired
public FieldDescriptor fullSpotField;
@Autowired
public FieldDescriptor annotationIdField;
public ExampleClass(FieldDescriptor fullSpotField,FieldDescriptor annotationIdField ){
super();
this.fullSpotField = fullSpotField;
this.annotationIdField = annotationIdField;
}
}