【源码阅读】看Spring Boot如何自动装配ActiveMQ收发组件
源于好奇,我研究了一下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对象中。 |
发送消息
发送消息组件的装配相对简单,主要代码都在ActiveMQConnectionFactoryConfiguration与JmsAutoConfiguration两个类中。
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 {@Configurationprotected 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主要作用是当JmsTemplate 与JmsMessagingTemplate两个类的对象不存在(没有由用户定义)时,初始化这两个类的默认Bean。
至此JMS消息发送关键组件初始化完成。用户可以通过Spring获得JmsTemplate 或JmsMessagingTemplate对象发送消息。
接收消息
Spring Boot接收消息的方法有好几种(具体请参阅),最简单与常用的方式就是使用@JmsListener注解在方法上。
Spring为每个带有@JmsListener注解的方法在后台构建了一个对应的MessageListenerContainer实例(老版本的Spring需要手动配置DefaultMessageListenerContainer,这里不再赘述)。
为了能自动创建MessageListenerContainer,Spring提供了@EnableJms注解,通过JmsListenerAnnotationBeanPostProcessor的BeanPostProcessor机制,指定带有@JmsListener注解的方法为一个MethodJmsListenerEndpoint,并将其通过JmsListenerEndpointRegistrar辅助类注册到JmsListenerEndpointRegistry中。此过程中,需要一个JmsListenerContainerFactory对象(由用户自定义创建或由Spring自动创建DefaultJmsListenerContainerFactory)来参与完成构建动作。几个关键类的关系图大致如下。
另外,用户也可以通过实现JmsListenerConfigurer来指定JmsListenerEndpointRegistrar对象在注册过程中的行为。
下面看一下几个核心类的代码。
JmsListenerAnnotationBeanPostProcessor
public class JmsListenerAnnotationBeanPostProcessorimplements 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@ConditionalOnMissingBeanpublic DefaultJmsListenerContainerFactoryConfigurer jmsListenerContainerFactoryConfigurer() {...}@Bean@ConditionalOnMissingBean(name = "jmsListenerContainerFactory")public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(DefaultJmsListenerContainerFactoryConfigurer configurer,ConnectionFactory connectionFactory) {...}
...
}
从源码可以看出,JmsAnnotationDrivenConfiguration主要作用是当名称为“jmsListenerContainerFactory”的bean不存在时初始化一个DefaultJmsListenerContainerFactory。
至此,接收消息的组件装配过程分析已完成。加上对应的配置项,用户可以从ActiveMQ中收到消息。
【源码阅读】看Spring Boot如何自动装配ActiveMQ收发组件相关推荐
- 【Spring 源码阅读】Spring IoC、AOP 原理小总结
Spring IoC.AOP 原理小总结 前言 版本约定 正文 Spring BeanFactory 容器初始化过程 IoC 的过程 bean 完整的创建流程如下 AOP 的过程 Annotation ...
- Spring Boot(一) 自动装配--约定大于配置
欢迎去我的个人博客--晓坞坐坐,里面有很多有趣的文章,不止是技术.www.lixiaodongisme.com 随着spring体系的发展,我们在开发时需要配置整合的东西也越来越多,在进行开发时,繁琐 ...
- (附源码)基于Spring boot开发电子宿舍管理系统 毕业设计132056
摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用.信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代. ...
- RocketMQ 源码分析 —— 集成 Spring Boot
点击上方"芋道源码",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~ 中文详细注释的开源项目 RP ...
- (附源码)APP+spring boot基于Android智能手机的微课程学习系统设计与实现 毕业设计100909
摘 要 随着现在网络的快速发展,网络的应用在各行各业当中它很快融入到了许多学校的眼球之中,他们利用网络来做这个微课程学习系统的网站,随之就产生了"智能手机的微课程学习系统 ",这 ...
- Spring 源码阅读 之 Spring框架加载
说起第一次阅读Spring Framework源码,大概还是2010年吧,那个时候还不懂技巧和方法,一头扎在代码的汪洋大海里,出不来了.后面几年偶尔断断续续的也看过几次,都是不得要领,最后都是无疾而终 ...
- spring依赖注入_Spring源码阅读:Spring依赖注入容器
依赖注入 依赖注入是Spring框架最核心的能力,Spring框架提供的AOP,WebMVC等其它功能都是以依赖注入容器作为基础构建的,Spring依赖注入容器类似于一个用于组装对象的框架内核,任何应 ...
- (附源码)基于Spring Boot的宠物猫店管理系统的设计与实现 毕业设计140909
springboot宠物猫店管理系统的设计与实现 摘 要 在信息飞速发展的今天,网络已成为人们重要的信息交流平台.宠物猫店管理系统公司每天都有大量的信息需要通过网络发布,为此,本人开发了一个基于B/S ...
- (附源码)基于Spring Boot的ERP仓储管理信息系统设计与实现 毕业设计150958
基于Spring Boot的ERP仓储管理信息系统设计与实现 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用.信息时代的 ...
最新文章
- 父与子的编程python_父母在人生尚有来处,父母去人生只剩归途!(看一次,哭一次)...
- skill——iptables(五)
- JAVA课程设计——“小羊吃蓝莓”小游戏
- 软件测试的左移方法(译)
- Win10电脑录屏,视频有杂音,用耳机录音
- Mac环境下安装Sass
- hdu-2612-Find a way(广搜,bfs)
- 现代web数据传输技术及数据格式
- 去掉高德api上的logo图标
- 【利用EXCEL进行数据爬虫】数据爬虫学习
- 无法绑定由多个部分组成的标识符 yvi312082007@163.com。
- Windows下Mingw版本的FFMPEG源码编译
- 关于SimpleDateFormat日期格式与字符串、时间戳之间的转换
- 轻量化规划调度引擎——OptaPlanner简介
- snmpwalk 安装与使用详解-windows下
- 陀螺仪、加速计和磁力计
- 服务器迁移实践,物理服务器迁移到阿里云服务器
- autocomplete=“off“ 阻止chrome浏览器回填账号密码
- 李航老师《统计学习方法》第二版第三章课后题答案
- LVGL 官方UI设计工具 EdgeLine代码移植
热门文章
- [转]Java 对象锁-synchronized()与线程的状态与生命周期
- 十年北漂,一个软件“攻城狮”到职业养鸡人的心路历程
- Android 开发 关于APP无法安装到Android模拟器上的问题
- SpringMVC Hello(IDEA)
- 13.python中的字典
- String课后作业
- OpenERP 关于页码总页数
- 使用 PDBDownloader 解决 IDA 加载 ntoskrnl.exe 时符号不完全问题
- Pycharm 加载pygame解决方案
- 回溯法解决0-1背包问题