首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Spring中自动装配共享队列的正确方法

Spring中自动装配共享队列的正确方法
EN

Stack Overflow用户
提问于 2015-08-03 22:50:59
回答 2查看 4.8K关注 0票数 6

我在应用程序中实现了一种生产者-消费者模式。一方面生产者推动实体处理从不同来源接收到的事件,另一方面我让消费者从队列中取出事件并对其进行处理。

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

代码语言:javascript
代码运行次数:0
运行
复制
@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;
    ....
}

创建这个包装器是否值得?我知道@Resource注解,但我只在列表、映射和集合中使用过它,实际上不知道如何配置资源Java配置文件。来自Spring文档页面的列表的XML示例:

代码语言:javascript
代码运行次数:0
运行
复制
<util:list id="emails">
    <value>pechorin@hero.org</value>
    <value>raskolnikov@slums.org</value>
    <value>stavrogin@gov.org</value>
    <value>porfiry@gov.org</value>
</util:list>

然后是Java类:

代码语言:javascript
代码运行次数:0
运行
复制
@Component
public class SomeClass {
   @Resource(name="emails")
   private List<String> emails;
}

有没有办法在java配置中创建队列作为这样的资源?或者,是否有其他方法可以将共享队列注入不同的bean?

EN

回答 2

Stack Overflow用户

发布于 2016-05-13 00:40:44

Don Bottstein建议的将会起作用,你只需要像这样使用它。

代码语言:javascript
代码运行次数:0
运行
复制
@Configuration
public class QueueConfig {

    @Bean
    public BlockingQueue<MyObject> blockingQueue() {
        return new LinkedBlockingQueue<>();
    }
}

然后在类中,Producer和Consumer这样做:

代码语言:javascript
代码运行次数:0
运行
复制
@Component
public class Producer {

    @Autowired
    private QueueConfig queueConfig;

    public void produceMyObject(MyObject myObject) {
        queueConfig.blockingQueue.put(myObject);
    }
}
票数 5
EN

Stack Overflow用户

发布于 2015-08-05 03:43:15

基本上,您将定义一个带@Configuration注释的类来注册给定类型的bean。例如,

代码语言:javascript
代码运行次数:0
运行
复制
@Configuration
public class AppConfig {
    @Bean
    public BlockingQueue<MyObject> sharedQueue() {
        return new LinkedBlockingQueue<>();
    }
}

bean名称缺省为方法的名称(在本例中为sharedQueue),或者您可以覆盖注释(@Bean(name="someName"))中的名称。默认作用域是singleton,可以在方法上使用@Scope(...)进行更改。

就像带@Component注释的类一样,@Configuration类在组件扫描期间被拾取。

但是,我不认为使用包装器类有任何问题。实际上,使用包装器类将允许您更容易地在实现中添加自适应。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31790412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档