Java Spring中自动连接共享队列的正确方法
我已经在我的应用程序中实现了一种生产者-消费者模式。一方面,生产者推动实体处理从不同来源接收的事件,另一方面,我有消费者将这些事件从队列中取出并处理它们 生产者和消费者都是自动发现的Springbean,都需要链接到此共享队列。我知道我可以在xml文件或Java配置中定义我的bean,并将此队列作为参数作为构造函数参数或通过setter传递,但是有没有办法自动导入它。我唯一想到的是为这个队列创建一个包装器,然后注入这个包装器:Java Spring中自动连接共享队列的正确方法,java,spring,autowired,Java,Spring,Autowired,我已经在我的应用程序中实现了一种生产者-消费者模式。一方面,生产者推动实体处理从不同来源接收的事件,另一方面,我有消费者将这些事件从队列中取出并处理它们 生产者和消费者都是自动发现的Springbean,都需要链接到此共享队列。我知道我可以在xml文件或Java配置中定义我的bean,并将此队列作为参数作为构造函数参数或通过setter传递,但是有没有办法自动导入它。我唯一想到的是为这个队列创建一个包装器,然后注入这个包装器: @Component public class QueueWrapp
@Component
public class QueueWrapper {
private final BlockingQueue<MyObject> sharedQueue = new LinkedBlockingQueue<>();
public void put(MyObject toPut) {
sharedQueue.put(toPut);
}
public MyObject take() {
return sharedQueue.take();
}
}
@Component
public class Producer {
@Autowire
private QueueWrapper queue;
....
}
@Component
public class Consumer {
@Autowire
private QueueWrapper queue;
....
}
然后是Java类:
@Component
public class SomeClass {
@Resource(name="emails")
private List<String> emails;
}
@组件
公共类{
@资源(name=“电子邮件”)
私人名单电子邮件;
}
在java配置中,有没有办法将队列创建为这样的资源?或者有其他方法将共享队列注入不同的bean吗?基本上,您可以定义一个
@Configuration
注释类来注册给定类型的bean。例如:
@Configuration
public class AppConfig {
@Bean
public BlockingQueue<MyObject> sharedQueue() {
return new LinkedBlockingQueue<>();
}
}
@配置
公共类AppConfig{
@豆子
公共阻止队列sharedQueue(){
返回新的LinkedBlockingQueue();
}
}
bean名称默认为方法的名称(在本例中为sharedQueue
),或者您可以覆盖注释中的名称(@bean(name=“someName”)
)。默认作用域是singleton,可以使用方法上的@scope(…)
来更改它
@Configuration
类在组件扫描期间被拾取,就像@component
注释类一样
然而,正如您所示,我认为使用包装器类没有任何错误。事实上,使用包装器类将使您能够更轻松地为后续实现添加适应性。Don Bottstein建议的方法将起作用,您只需像这样使用它
@Configuration
public class QueueConfig {
@Bean
public BlockingQueue<MyObject> blockingQueue() {
return new LinkedBlockingQueue<>();
}
}
可能是一个具有
getQueue()
方法的@组件类ProducerConsumerConfiguration
。但这更多的是一个概念上的差异,仍然是一种包装。实际上这个解决方案不起作用。我有以下异常-NoSuchBeanDefinitionException:dependency[collection of com.example.MyObject]找不到[com.example.MyObject]类型的符合条件的bean
我完全可以使用包装器,但我认为应该有更优雅的解决方案
@Configuration
public class QueueConfig {
@Bean
public BlockingQueue<MyObject> blockingQueue() {
return new LinkedBlockingQueue<>();
}
}
@Component
public class Producer {
@Autowired
private QueueConfig queueConfig;
public void produceMyObject(MyObject myObject) {
queueConfig.blockingQueue.put(myObject);
}
}