我目前正在开发一个rabbit-amqp实现项目,并使用spring-rabbit以编程方式设置我的所有队列,绑定和交换。 (spring-rabbit-1.3.4和spring-framework version 3.2.0)
在我看来,javaconfiguration类或基于xml的配置中的声明都是非常静态的。我知道如何为队列,交换设置更动态的值(例如名称) 或像这样绑定:
@Configuration
public class serverConfiguration {
private String queueName;
...
@Bean
public Queue buildQueue() {
Queue queue = new Queue(this.queueName, false, false, true, getQueueArguments());
buildRabbitAdmin().declareQueue(queue);
return queue;
}
...
}
但是我想知道是否有可能创建一个未定义的Queue和 将它们注册为bean,就像注册其所有实例的工厂一样。
我不太熟悉Spring @Bean注释及其局限性,但我尝试了
@Configuration
public class serverConfiguration {
private String queueName;
...
@Bean
@Scope("prototype")
public Queue buildQueue() {
Queue queue = new Queue(this.queueName, false, false, true, getQueueArguments());
buildRabbitAdmin().declareQueue(queue);
return queue;
}
...
}
要查看Queue的多个Bean实例是否已注册,我调用:
Map<String, Queue> queueBeans = ((ListableBeanFactory) applicationContext).getBeansOfType(Queue.class);
但这只会返回1个映射:
name of the method := the last created instance.
是否可以在运行时将bean动态添加到SpringApplicationContext?
答案 0 :(得分:7)
您可以动态地将bean添加到上下文中:
context.getBeanFactory().registerSingleton("foo", new Queue("foo"));
但他们不会被管理员自动声明;你必须调用admin.initialize()
强制它重新声明上下文中的所有AMQP元素。
你不会在@Bean
中执行其中任何一个,只需要正常的运行时java代码。