这是我的代码:
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
import java.util.List;
@Configuration
public class ResourceTest {
@Bean
TestBean testBean () {
return new TestBean();
}
@Bean
TargetBean targetBean () {
return new TargetBean("bean1");
}
@Bean(name = "myBean")
TargetBean targetBean2 () {
return new TargetBean("bean2");
}
@Bean(name = "myBean")
TargetBean targetBean3 () {
return new TargetBean("bean3");
}
public static void main (String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
ResourceTest.class);
TestBean bean = context.getBean(TestBean.class);
System.out.println(bean.getTargetBeanList());
}
public static class TestBean {
private List<TargetBean> targetBeanList;
@Resource(name = "myBean")
public void setXList (List<TargetBean> targetBeanList) {
this.targetBeanList = targetBeanList;
}
public List<TargetBean> getTargetBeanList () {
return targetBeanList;
}
}
public static class TargetBean {
private final String str;
public TargetBean (String str) {
this.str = str;
}
public String getStr () {
return str;
}
@Override
public String toString () {
return "TargetBean{ str='" + str + '\'' +
'}';
}
}
}
输出: [TargetBean{ str='bean2'}]
预期: 所有符合“myBean”条件的 bean 都应该在列表中,即 bean2 和 bean3。
根据 spring 引用文档:
Qualifiers also apply to typed collections, as discussed above, for example, to Set. In this case, all matching beans according to the declared qualifiers are injected as a collection. This implies that qualifiers do not have to be unique; they rather simply constitute filtering criteria. For example, you can define multiple MovieCatalog beans with the same qualifier value "action", all of which would be injected into a Set annotated with @Qualifier("action").
我正在使用 Spring 4.3.2.RELEASE。请帮忙解决这个问题。提前致谢。
最佳答案
@Bean
注释元素中的name
表示相应的 bean 定义的标识符。如果您有两个具有相同 id 的 bean 定义,则稍后注册的一个会覆盖前一个。这就是你的 bean 在这里发生的事情
@Bean(name = "myBean")
TargetBean targetBean2 () {
return new TargetBean("bean2");
}
@Bean(name = "myBean")
TargetBean targetBean3 () {
return new TargetBean("bean3");
}
你已经链接了文档的那部分,但你没有做它说的任何事情。
For example, you can define multiple
MovieCatalog
beans with the same qualifier value "action"
让我们根据您的 bean 进行调整
@Bean(name = "myBean2")
@Qualifier("myBean")
TargetBean targetBean2() {
return new TargetBean("bean2");
}
@Bean(name = "myBean3")
@Qualifier("myBean")
TargetBean targetBean3() {
return new TargetBean("bean3");
}
请注意它们有不同的 ID(您可以省略 @Bean
注释,Spring 将使用方法名称)但使用相同的 @Qualifier
值。
然后
all of which would be injected into a Set annotated with
@Qualifier("action")
在你的注入(inject)点,使用它
@Autowired
@Qualifier("myBean")
public void setXList(List<TargetBean> targetBeanList) {
this.targetBeanList = targetBeanList;
}
targetBeanList
现在将包含使用 myBean
限定的两个 TargetBean
bean。
Spring 通过使用提供的 name
来解析 @Resource
以按名称查找 bean。它不知道 @Qualifier
值。这就是我们在上面使用 @Autowired
和 @Qualifier
的原因。
关于java - 您如何使用相同的@Qualifier 注入(inject)一个bean 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39025075/