Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring中自动连接共享队列的正确方法_Java_Spring_Autowired - Fatal编程技术网

Java Spring中自动连接共享队列的正确方法

Java Spring中自动连接共享队列的正确方法,java,spring,autowired,Java,Spring,Autowired,我已经在我的应用程序中实现了一种生产者-消费者模式。一方面,生产者推动实体处理从不同来源接收的事件,另一方面,我有消费者将这些事件从队列中取出并处理它们 生产者和消费者都是自动发现的Springbean,都需要链接到此共享队列。我知道我可以在xml文件或Java配置中定义我的bean,并将此队列作为参数作为构造函数参数或通过setter传递,但是有没有办法自动导入它。我唯一想到的是为这个队列创建一个包装器,然后注入这个包装器: @Component public class QueueWrapp

我已经在我的应用程序中实现了一种生产者-消费者模式。一方面,生产者推动实体处理从不同来源接收的事件,另一方面,我有消费者将这些事件从队列中取出并处理它们

生产者和消费者都是自动发现的Springbean,都需要链接到此共享队列。我知道我可以在xml文件或Java配置中定义我的bean,并将此队列作为参数作为构造函数参数或通过setter传递,但是有没有办法自动导入它。我唯一想到的是为这个队列创建一个包装器,然后注入这个包装器:

@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);
    }
}