SpringBoot消息源码解析
Spring框架对消息系统的整合提供了广泛的支持:从简单使用 Jms Template 的 JMS API,到可接收异步消息的完整基础结构。Spring AMQP 为“高级消息队列协议”提供了类似的功能集。
同时,Spring Boot 也为 RabbitTemplate 和 Rabbit MQ 提供了自动配置选项。Spring Boot通过自动配置对 ActiveMQ、RabbitMQ 和 Apache Kafka 提供了支持。本章重点讲解 SpringBoot 对 JMS 和 ActiveMQ 的自动配置操作。
JMS 基础自动配置
JMS 的全称是 Java Message Service,即 Java 消息服务。它主要用于在生产者和消费者之间进行消息传递。JMS 只是一个标准, 在使用的时候需要有具体实现,比如后面要讲到的ActiveMQ。
在 Spring Boot 中,通过 JmsAutoConfiguration 自动配置来完成 JMS 的基础组件的初始化。
像其他自动配置-样,在 ME TA-INF/spring.factories 中可以找到注册的 JMS 自动配置类。
# Auto Configureorg. springframework . boot . autoconfigure . jms . JmsAutoConfiguration
![55cea971aa0dd169b34f8af843ff22c9.png](https://i-blog.csdnimg.cn/blog_migrate/919f44e759cb59cc58316672556323b5.jpeg)
JmsAutoConfiguration 的注解
我们先从 JmsAutoConfiguration 的注解部分看起。
@Configuration(proxyBeanMethods = false)@Conditional0nClass({ Message . class, JmsTemplate.class })@ConditionalOnBean(ConnectionFactory . class)@EnableConfigurationProperties (JmsProperties .class)@Import (JmsAnnotat ionDrivenConfiguration. class)public class JmsAutoConfiguration {}
@ConditionalOnClass 注解指定需要满足在 classpath 下存在javax.jms.Message 类和 org.springframework.jms.core.Jms Template 类的条件才会进行初始化。
@ConditionalOnBean 注解指定需要在容器中存在javax.jms.ConnectionFactory 的 Bean 对象时才会被实例化。
ConnectionFactory 接口提供了用于创建与 JMS 代理进行交互的 javax.jms.Connection 的标准方法。Spring 需要 ConnectionFactory 来 与 JMS 一起使用,但是通常不需要编程人员直接使用它。
那么,ConnectionFactory 的 Bean 是在什么时候被初始化的呢?以 ActiveMQ 为例,Active-MQ 的自动配置会在 JmsAutoConfiguration 配置之前执行,并在其内部创建Connection-Factory 实现类的 Bean 对象。 其他消息框架也与此类似,至于是如何初始化的,后面关于 ActiveMQ 的自动配置的部分我们会进行详解。
@EnableConfigurationProperties引入了JMS的配置属性类 ,对应的就 是 在application.properties 文件中配置的以“spring.jms”为前缀的属性。
@Import 引入了 JmsAnnotationDrivenConfiguration 配置,该配置类主要用于 Spring4.1 注解驱动的 JMS 的自动配置。
下面我们先看 JmsAnnotationDrivenConfiguration 的注解部分和构造方法的源代码。
@Configuration(p