如何仅通过注解将同类型Bean合并为集合/数组并注入?
当然可以!纯注解就能搞定,完全不需要ApplicationContext的额外方法
Spring本身就内置了这种同类型Bean的集合注入能力,你写的代码其实已经是正确的实现方式了——当你在@Bean方法(或者@Component类的构造器/Setter方法)中声明Collection<MyBean>(或者List<MyBean>、Set<MyBean>)作为依赖参数时,Spring会自动扫描容器中所有类型为MyBean的Bean,把它们全部收集起来注入到这个集合里。
完整代码示例
先看基础的MyBean类:
public class MyBean { private int id; public MyBean(int id) { this.id = id; } // 可选:添加getter和toString方便调试 public int getId() { return id; } @Override public String toString() { return "MyBean{" + "id=" + id + '}'; } }
然后是配置类,包含多个MyBean的定义和最终的MyFinalBean:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Collection; @Configuration public class BeanConfig { @Bean public MyBean myBean1() { return new MyBean(1); } @Bean public MyBean myBean2() { return new MyBean(2); } @Bean public MyBean myBean3() { return new MyBean(3); } // 直接注入Collection<MyBean>,Spring自动收集所有MyBean实例 @Bean public MyFinalBean myFinalBean(Collection<MyBean> myBeans) { return new MyFinalBean(myBeans); } }
最后是接收集合的MyFinalBean:
import java.util.Collection; public class MyFinalBean { private Collection<MyBean> myBeans; public MyFinalBean(Collection<MyBean> myBeans) { this.myBeans = myBeans; } // 测试用方法,验证集合内容 public void printAllBeans() { myBeans.forEach(System.out::println); } }
额外实用细节
- 集合顺序控制:如果需要指定Bean在集合中的顺序,可以给每个
@Bean方法添加@Order(n)注解,Spring会按照n值从小到大排列集合元素(未加@Order的Bean默认优先级最低,会排在最后)。 - Map注入替代:如果需要同时获取Bean的名称和实例,可以用
Map<String, MyBean>作为注入参数——此时Map的key是Bean的名称(即@Bean方法的名字,比如myBean1),value是对应的Bean实例。 - @Primary不影响集合:即使某个
MyBean被标记了@Primary,集合依然会包含所有同类型Bean,@Primary仅在你直接注入单个MyBean实例时生效。
内容的提问来源于stack exchange,提问作者Oleksandr
相关产品推荐
相关产品推荐

