java - 您如何使用相同的@Qualifier 注入(inject)一个bean 列表?

标签 java spring

这是我的代码:

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/

相关文章:

java - 在 Spring MVC 中以 XML 形式获取 SOAP 请求

spring - 如何停止 org.springframework.web.client.RestTemplate 缓存响应?

Java double

java - 简单 XML 是否支持 xsd :dateTime date format out of box?

java - Spring RestTemplate 字符集 UTF-8 不起作用

java - 如何访问 Spring Bean 名称?

java - 将编码器添加到 Sentry 附加器时出现错误

java - Eclipse 项目无法识别 Swagger Codegen Artifact

Java,JXMapKit : How to catch java.net.UnknownHostException

java - 如何使用 groovy 配置文件激活 "Logback setup" Debug模式?