一 .概述
在上一次我們整合成功了ConnectionFactory,本次我們需要整合RabbitAdmin組件,該組件可以幫助我們聲明交換機,隊列,綁定,並可以完成一般性的工作.
二 .添加RabbitAdmin組件
向容器之中添加一個下面的bean,這個bean就是我們希望添加的一個RabbitAdmin.
@Bean public RabbitAdmin amqpAdmin(ConnectionFactory connectionFactory) { RabbitAdmin admin = new RabbitAdmin(connectionFactory); admin.setAutoStartup(true); return admin; }
下面我們演示聲明一個交換機,聲明一個隊列,聲明一個綁定,這是我們使用RabbitAdmin最常用的使用方式.
@Resource private RabbitAdmin admin; @Test public void rabbitmqAdmin() { // 聲明一個交換機 admin.declareExchange(new DirectExchange("admin_exchange", false, false)); // 聲明一個隊列 admin.declareQueue(new Queue("admin_queue", false, false, false)); // 聲明一個綁定 admin.declareBinding( new Binding("admin_queue", DestinationType.QUEUE, "admin_exchange", "admin", null)); }
我們在上面聲明了我們了一個交換機,一個隊列和一個綁定,我們發現使用這種方式比我們使用客戶端進行組件的聲明要簡單的多.
三 .源碼分析
public class RabbitAdmin implements AmqpAdmin, ApplicationContextAware, ApplicationEventPublisherAware, InitializingBean {
我們首先看一下我們的RabbitAdmin組件,我們發現它實現了一個InitializingBean接口,那么我們需要關心的就是實現的方法了.
@Override public void afterPropertiesSet() {
在上面的這個實現的方法之中,我們找到最關鍵的方法initialize();
我們進去看看是怎么實現的
Collection<Exchange> contextExchanges = new LinkedList<Exchange>( this.applicationContext.getBeansOfType(Exchange.class).values()); Collection<Queue> contextQueues = new LinkedList<Queue>( this.applicationContext.getBeansOfType(Queue.class).values()); Collection<Binding> contextBindings = new LinkedList<Binding>( this.applicationContext.getBeansOfType(Binding.class).values());
我們發現,首先就是從IOC容器之中獲取到所有的交換機和隊列和綁定.
this.rabbitTemplate.execute(new ChannelCallback<Object>() { @Override public Object doInRabbit(Channel channel) throws Exception { declareExchanges(channel, exchanges.toArray(new Exchange[exchanges.size()])); declareQueues(channel, queues.toArray(new Queue[queues.size()])); declareBindings(channel, bindings.toArray(new Binding[bindings.size()])); return null; } });
然后我們就發現使用了rabbitTemplate對象進行聲明了.
從上面的代碼之中,我們能夠得到一個快速創建交換機,隊列,綁定的的方法,那就是我們直接將這些對象注入到IOC容器之中,那么spring就會幫助我們進行聲明.
下面我們就做一個測試:
@Bean public Exchange exchange() { return new TopicExchange("bean_exchange", true, false); }
我們啟動容器,看看是否能幫助我們聲明一個交換機呢?

我們發現我們成功的創建了一個bean_exchange,通過這種方式,我們可以更簡單的聲明一個隊列,交換機等基本的操作.
