Spring中java.util.Queue Bean注入异常原因及正确定义方法
Spring注入java.util.Queue Bean异常原因及解决方法
问题原因
- @Bean方法返回实例类型不匹配:如果你的
@Bean方法声明返回Queue<Service>,但实际返回的是LinkedHashMap$LinkedValues(比如调用applicationContext.getBeansOfType(Service.class).values()拿到的集合),这个类仅实现了Collection和Iterable接口,并非Queue的实现类,注入时必然触发类型转换异常。 - Spring集合注入的默认逻辑差异:当容器内存在多个同类型Bean时,注入
List时Spring会自动把所有同类型Bean打包成List实例;但Queue属于队列接口,Spring没有默认的自动收集逻辑,必须显式提供实现Queue接口的Bean实例,否则会强制转换其他集合类型,导致报错。
正确定义Queue Bean的方法
方法1:手动创建Queue实例并添加元素
直接使用LinkedList、ArrayDeque这类Queue的具体实现类,手动添加需要的Service实例:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Queue; import java.util.LinkedList; @Configuration public class AppConfig { @Bean public Service service1() { return new ServiceImpl1(); } @Bean public Service service2() { return new ServiceImpl2(); } @Bean public Queue<Service> serviceQueue(Service service1, Service service2) { Queue<Service> queue = new LinkedList<>(); queue.add(service1); queue.add(service2); return queue; } }
方法2:自动收集所有Service到Queue中
如果需要把容器内所有Service类型的Bean都放进Queue,需显式将收集到的集合转换为Queue实现类:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.beans.factory.ListableBeanFactory; import java.util.Queue; import java.util.LinkedList; import java.util.Map; @Configuration public class AppConfig { @Bean public Queue<Service> serviceQueue(ListableBeanFactory beanFactory) { Map<String, Service> serviceMap = beanFactory.getBeansOfType(Service.class); return new LinkedList<>(serviceMap.values()); } }
方法3:多Queue场景下指定注入目标
如果容器内存在多个Queue类型的Bean,注入时要用@Qualifier指定对应的Bean名称:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import java.util.Queue; @Component public class ServiceConsumer { private final Queue<Service> serviceQueue; @Autowired public ServiceConsumer(@Qualifier("serviceQueue") Queue<Service> serviceQueue) { this.serviceQueue = serviceQueue; } }
内容的提问来源于stack exchange,提问作者Yevhen Vasyliev
相关产品推荐
相关产品推荐

