【源码阅读】看Spring Boot如何自动装配ActiveMQ收发组件

简介: 源于好奇,我研究了一下Spring Boot中ActiveMQ相关组件是如何自动装配的。记录如下。源码路径本文以Spring Boot 1.5.10.RELEASE版本为例。

源于好奇,我研究了一下Spring Boot中ActiveMQ相关组件是如何自动装配的。记录如下。

源码路径

本文以Spring Boot 1.5.10.RELEASE版本为例。

在spring-boot-autoconfigure-1.5.10.RELEASE.jar中的spring.factories文件中可以找到相JMS自动装配类。

org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\

在spring-jms-4.3.14.RELEASE.jar中包含了jms组件的所有具体功能类。

Configuration类加载顺序

顺序 类名 import引入
1 JndiConnectionFactoryAutoConfiguration
2 ActiveMQAutoConfiguration ActiveMQXAConnectionFactoryConfiguration, ActiveMQConnectionFactoryConfiguration
3 JmsAutoConfiguration JmsAnnotationDrivenConfiguration, JmsBootstrapConfiguration(由JmsAnnotationDrivenConfiguration中的@EnableJms注解引入)

以上罗列出了与ActiveMQ相关的配置类,默认ActiveMQ是采用JMS协议连接的。Spring的JMS消息组件接收与发送是毫不相关的体系。下文分别阐述。

关键类列表

类名 类别 作用
JmsProperties Properties注入 spring.jms开头的配置项注入
ActiveMQProperties Properties注入 spring.activmeq开头的配置项注入
ActiveMQAutoConfiguration @Configuration 无具体代码,通过注解引入ActiveMQXAConnectionFactoryConfiguration与ActiveMQConnectionFactoryConfiguration两个配置类
ActiveMQXAConnectionFactoryConfiguration @Configuration 配置ActiveMQ XA(点击这里了解XA)连接工厂
ActiveMQConnectionFactoryConfiguration @Configuration 配置ActiveMQ连接工厂
JmsAutoConfiguration @Configuration 与发送消息组件相关,初始化JmsTemplate与JmsMessagingTemplate(Spring4.1后引入)
JmsAnnotationDrivenConfiguration @Configuration 与接收消息组件相关,初始化JmsListenerContainerFactory
JmsBootstrapConfiguration @Configuration 初始化JmsListenerAnnotationBeanPostProcessor 与JmsListenerEndpointRegistry两个类的Bean
JmsListenerAnnotationBeanPostProcessor Bean 自定义JmsListenerEndpointRegistrar行为,并将带有@JmsListener的方法注册到指定的JmsListenerContainerFactory中。
JmsListenerEndpointRegistrar Bean 将JmsListenerEndpoint对象注册到JmsListenerEndpointRegistry对象中。

发送消息

发送消息组件的装配相对简单,主要代码都在ActiveMQConnectionFactoryConfigurationJmsAutoConfiguration两个类中。

ActiveMQConnectionFactoryConfiguration

class ActiveMQConnectionFactoryConfiguration {

    @Bean
    @ConditionalOnProperty(prefix = "spring.activemq.pool", name = "enabled", havingValue = "false", matchIfMissing = true)
    public ActiveMQConnectionFactory jmsConnectionFactory(ActiveMQProperties properties,
            ObjectProvider<List<ActiveMQConnectionFactoryCustomizer>> factoryCustomizers) {
        ...
    }

    @Bean(destroyMethod = "stop")
    @ConditionalOnProperty(prefix = "spring.activemq.pool", name = "enabled", havingValue = "true", matchIfMissing = false)
    @ConfigurationProperties(prefix = "spring.activemq.pool.configuration")
    public PooledConnectionFactory pooledJmsConnectionFactory(
                ActiveMQProperties properties,
                ObjectProvider<List<ActiveMQConnectionFactoryCustomizer>> factoryCustomizers) {
            ...
    }

}

可以看到,此类根据配置项的不同初始化了ActiveMQ的连接工厂ActiveMQConnectionFactory或PooledConnectionFactory。

JmsAutoConfiguration

public class JmsAutoConfiguration {

    @Configuration
    protected static class JmsTemplateConfiguration {
        ...
        @Bean
        @ConditionalOnMissingBean
        @ConditionalOnSingleCandidate(ConnectionFactory.class)
        public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) {
            ...
        }
    }

    @Configuration
    @ConditionalOnClass(JmsMessagingTemplate.class)
    @Import(JmsTemplateConfiguration.class)
    protected static class MessagingTemplateConfiguration {

        @Bean
        @ConditionalOnMissingBean
        @ConditionalOnSingleCandidate(JmsTemplate.class)
        public JmsMessagingTemplate jmsMessagingTemplate(JmsTemplate jmsTemplate) {
            return new JmsMessagingTemplate(jmsTemplate);
        }
    }
}

从源码中可以看到,JmsAutoConfiguration主要作用是当JmsTemplateJmsMessagingTemplate两个类的对象不存在(没有由用户定义)时,初始化这两个类的默认Bean。

至此JMS消息发送关键组件初始化完成。用户可以通过Spring获得JmsTemplateJmsMessagingTemplate对象发送消息。

接收消息

Spring Boot接收消息的方法有好几种(具体请参阅),最简单与常用的方式就是使用@JmsListener注解在方法上。

Spring为每个带有@JmsListener注解的方法在后台构建了一个对应的MessageListenerContainer实例(老版本的Spring需要手动配置DefaultMessageListenerContainer,这里不再赘述)。

为了能自动创建MessageListenerContainer,Spring提供了@EnableJms注解,通过JmsListenerAnnotationBeanPostProcessorBeanPostProcessor机制,指定带有@JmsListener注解的方法为一个MethodJmsListenerEndpoint,并将其通过JmsListenerEndpointRegistrar辅助类注册到JmsListenerEndpointRegistry中。此过程中,需要一个JmsListenerContainerFactory对象(由用户自定义创建或由Spring自动创建DefaultJmsListenerContainerFactory)来参与完成构建动作。几个关键类的关系图大致如下。

img_a512b85caa0f4c844b0f9a8073297bcb.png
JmsListener注册关键类结构图

另外,用户也可以通过实现JmsListenerConfigurer来指定JmsListenerEndpointRegistrar对象在注册过程中的行为。

下面看一下几个核心类的代码。

JmsListenerAnnotationBeanPostProcessor

public class JmsListenerAnnotationBeanPostProcessor
        implements MergedBeanDefinitionPostProcessor, Ordered, BeanFactoryAware, SmartInitializingSingleton {
...
        public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException {
        ....
                for (Map.Entry<Method, Set<JmsListener>> entry : annotatedMethods.entrySet()) {
                    Method method = entry.getKey();
                    for (JmsListener listener : entry.getValue()) {
                        processJmsListener(listener, method, bean);
                    }
                }
        ...
        }

        protected void processJmsListener(JmsListener jmsListener, Method mostSpecificMethod, Object bean) {
        ...
                this.registrar.registerEndpoint(endpoint, factory);
        }

从以上的源码片段可以看出,JmsListenerAnnotationBeanPostProcessor的主要作用是将带有@JmsListener的方法(Endpoint)注册到JmsListenerContainerFactory中。

JmsAnnotationDrivenConfiguration

class JmsAnnotationDrivenConfiguration {
...
    @Bean
    @ConditionalOnMissingBean
    public DefaultJmsListenerContainerFactoryConfigurer jmsListenerContainerFactoryConfigurer() {
        ...
    }

    @Bean
    @ConditionalOnMissingBean(name = "jmsListenerContainerFactory")
    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(
            DefaultJmsListenerContainerFactoryConfigurer configurer,
            ConnectionFactory connectionFactory) {
        ...
    }
...
}

从源码可以看出,JmsAnnotationDrivenConfiguration主要作用是当名称为“jmsListenerContainerFactory”的bean不存在时初始化一个DefaultJmsListenerContainerFactory。

至此,接收消息的组件装配过程分析已完成。加上对应的配置项,用户可以从ActiveMQ中收到消息。

相关文章
|
6月前
|
消息中间件 存储 Java
第15课: Spring Boot中集成ActiveMQ
第15课: Spring Boot中集成ActiveMQ
514 0
|
3月前
|
安全 Java 决策智能
Spring Boot自动装配
Spring Boot自动装配基于“约定优于配置”理念,通过条件化配置与Starters机制,智能推断并加载所需组件,大幅简化开发流程。它实现配置自动化,提升效率,降低维护成本,支持自定义扩展,推动微服务快速构建,是Java生态中开发范式的革新之作。(238字)
|
3月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
464 2
|
9月前
|
NoSQL 安全 Java
深入理解 RedisConnectionFactory:Spring Data Redis 的核心组件
在 Spring Data Redis 中,`RedisConnectionFactory` 是核心组件,负责创建和管理与 Redis 的连接。它支持单机、集群及哨兵等多种模式,为上层组件(如 `RedisTemplate`)提供连接抽象。Spring 提供了 Lettuce 和 Jedis 两种主要实现,其中 Lettuce 因其线程安全和高性能特性被广泛推荐。通过手动配置或 Spring Boot 自动化配置,开发者可轻松集成 Redis,提升应用性能与扩展性。本文深入解析其作用、实现方式及常见问题解决方法,助你高效使用 Redis。
914 4
|
10月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
374 0
|
6月前
|
JSON 前端开发 Java
Spring MVC 核心组件与请求处理机制详解
本文解析了 Spring MVC 的核心组件及请求流程,核心组件包括 DispatcherServlet(中央调度)、HandlerMapping(URL 匹配处理器)、HandlerAdapter(执行处理器)、Handler(业务方法)、ViewResolver(视图解析),其中仅 Handler 需开发者实现。 详细描述了请求执行的 7 步流程:请求到达 DispatcherServlet 后,经映射器、适配器找到并执行处理器,再通过视图解析器渲染视图(前后端分离下视图解析可省略)。 介绍了拦截器的使用(实现 HandlerInterceptor 接口 + 配置类)及与过滤器的区别
498 0
|
10月前
|
消息中间件 存储 Java
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
本教程介绍ActiveMQ的安装与基本使用。首先从官网下载apache-activemq-5.15.3版本,解压后即可完成安装,非常便捷。启动时进入解压目录下的bin文件夹,根据系统选择win32或win64,运行activemq.bat启动服务。通过浏览器访问`http://127.0.0.1:8161/admin/`可进入管理界面,默认用户名密码为admin/admin。ActiveMQ支持两种消息模式:点对点(Queue)和发布/订阅(Topic)。前者确保每条消息仅被一个消费者消费,后者允许多个消费者同时接收相同消息。
349 0
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
|
10月前
|
消息中间件 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——发布/订阅消息的生产和消费
本文详细讲解了Spring Boot中ActiveMQ的发布/订阅消息机制,包括消息生产和消费的具体实现方式。生产端通过`sendMessage`方法发送订阅消息,消费端则需配置`application.yml`或自定义工厂以支持topic消息监听。为解决点对点与发布/订阅消息兼容问题,可通过设置`containerFactory`实现两者共存。最后,文章还提供了测试方法及总结,帮助读者掌握ActiveMQ在异步消息处理中的应用。
462 0
|
10月前
|
消息中间件 网络协议 Java
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ集成
本文介绍了在 Spring Boot 中集成 ActiveMQ 的详细步骤。首先通过引入 `spring-boot-starter-activemq` 依赖并配置 `application.yml` 文件实现基本设置。接着,创建 Queue 和 Topic 消息类型,分别使用 `ActiveMQQueue` 和 `ActiveMQTopic` 类完成配置。随后,利用 `JmsMessagingTemplate` 实现消息发送功能,并通过 Controller 和监听器实现点对点消息的生产和消费。最后,通过浏览器访问测试接口验证消息传递的成功性。
667 0
|
10月前
|
消息中间件 Java API
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ—— JMS 和 ActiveMQ 介绍
本文介绍如何在Spring Boot中集成ActiveMQ,首先阐述了JMS(Java消息服务)的概念及其作为与具体平台无关的API在异步通信中的作用。接着说明了JMS的主要对象模型,如连接工厂、会话、生产者和消费者等,并指出JMS支持点对点和发布/订阅两种消息类型。随后重点讲解了ActiveMQ,作为Apache开源的消息总线,它完全支持JMS规范,适用于异步消息处理。最后,文章探讨了在Spring Boot中使用队列(Queue)和主题(Topic)这两种消息通信形式的方法。
356 0