开始
那么我们就用一下ConnectionFactory。我们调用这个方法就是为了用下它
链接了MQ并返回了Connection对象。
用过就会把队列都创建好。甚至可以在下面这里declare一个无关紧要的change
启动测试。我们使用createConnection的方式
看管控台,都创建出来了 这些路由
绑定关系
源码
进入到RabbitAdmin的类里面
主要看实现的这两个接口
这个接口内只有这个方法。如果实现了这个方法,你把它作为Spring Bean的时候,它会将Spring的上下文整个塞给你。
rabbitAdmin确实实现了这个方法
Spring把applicationContext塞给了他
我们进入ApplicationContext里面看一下。这里有Spring Boot的整个容器。所有Bean的名称都有。
这样我们就可以通过这个ApplicationContext拿到spring容器里面的所有exchange、queue、biding
还实现了InitializingBean
这个接口有一个afterPropertiesSet方法。当这个Bean被自动声明,这个Bean被处理好放进Spring容器的时候,会自动的调用这个afterPropertiesSet方法,也就是说当我们的Bean被做好后,它会自动的去执行这个afterPropertiesSet方法
这个方法会导致我们的Bean放进Spring boot 容器之后,并且被处理好之后,会自动调用这个方法。
先加了一个锁
把这个Bean变成initializing的状态,初始化的状态。
这个方法里面有一个initialize方法
这个方法不是直接调用的,这个方法在这。会把选中的这整个方法,整个的莱姆达表达式或者叫做匿名函数,set到ConnectionFactory里面。
而且他塞的是ConnectionListener
ctrl+alt+鼠标左键。
再进去ConnectionListener
FunctionalInterface里面只有一个方法。
FunctionalInterface里面只有一个方法。就是我们写的这个方法。
把这一坨莱姆达表达式set到了
把这一坨莱姆达表达式set到了这个里面。connectionListener里面。就是当做这个Connection要链接的时候,他要调用回调方法。当connection一旦有链接就调用方法。
这个方法就是做了一堆操作,做了initialize方法
我们进入到initialized方法内。
它在applicationContext里面
找所有的是Exchange的、Queue的、Binding的Bean
知道这些Bean后做了declare。底层的底层还是用了channel去做这些操作。
它是把这个方法注册到了ConnectionFactory里面,ConnectionFactory一旦有任何的链接生成,它会回调这个方法。
这也就解释了 为什么我们在RabbitConfig这个类里面,把这些Bean交给Spring 容器管理后它能自动的创建。还解释了为什么ConnectionFactory没有任何的操作的时候,它不自动创建。因为没有操作它不会回调注册的方法。它有任何操作只要建立了链接就会调用回调。
我们加了这一行createConnetion这行无意义的代码。为了刺激它一下,让它做链接的操作。它一会链接的操作就会调用initialize方法。我们后面整套接入MQP之后,就不需要这样刺激它了