当前位置: 首页 > news >正文

RedisMessageListenerContainer容器初始化

RedisMessageListenerContainer是Spring Data Redis提供的一个容器类,为Redis监听器提供异步处理能力,处理低级别消息、转换Redis的消息通道,它通常与MessageListenerAdapter和自定义的消息监听器一起使用。

一、RedisMessageListenerContainer容器类初始化
	private void initMessageListenerContainer() {this.messageListenerContainer = new RedisMessageListenerContainer();this.messageListenerContainer.setConnectionFactory(((RedisTemplate<?, ?>) redisOps).getConnectionFactory());this.messageListenerContainer.afterPropertiesSet();this.messageListenerContainer.start();}

org.springframework.data.redis.core.RedisKeyValueAdapter适配器类会在构造函数或afterPropertiesSet回调方法中调用initMessageListenerContainer初始化方法。

二、RedisKeyValueAdapter适配器类
	private static AbstractBeanDefinition createRedisKeyValueAdapter(RepositoryConfigurationSource configuration) {BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(RedisKeyValueAdapter.class) //.addConstructorArgReference(configuration.getRequiredAttribute("redisTemplateRef", String.class)) //.addConstructorArgReference(REDIS_CONVERTER_BEAN_NAME) //.addPropertyValue("enableKeyspaceEvents",configuration.getRequiredAttribute("enableKeyspaceEvents", EnableKeyspaceEvents.class)) //.addPropertyValue("keyspaceNotificationsConfigParameter",configuration.getAttribute("keyspaceNotificationsConfigParameter", String.class).orElse("")) //.addPropertyValue("shadowCopy", configuration.getRequiredAttribute("shadowCopy", ShadowCopy.class));configuration.getAttribute("messageListenerContainerRef").ifPresent(it -> builder.addPropertyReference("messageListenerContainer", it));return builder.getBeanDefinition();}

org.springframework.data.redis.repository.configuration.RedisRepositoryConfigurationExtension类会在registerBeansForRoot方法中将RedisKeyValueAdapter对象定义成AbstractBeanDefinition对象注册到BeanDefinitionRegistry中。

三、RedisRepositoryConfigurationExtension对象初始化
	@Overrideprotected RepositoryConfigurationExtension getRepositoryConfigurationExtension() {return new RedisRepositoryConfigurationExtension();}

RedisRepositoriesRegistrar类中定义类RedisRepositoryConfigurationExtension对象的实例化方法,并且被RedisRepositoriesRegistrar的抽象父类AbstractRepositoryConfigurationSourceSupport中的registerBeanDefinitions方法调用。

AbstractRepositoryConfigurationSourceSupport#registerBeanDefinitions方法:

@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,BeanNameGenerator importBeanNameGenerator) {RepositoryConfigurationDelegate delegate = new RepositoryConfigurationDelegate(getConfigurationSource(registry, importBeanNameGenerator), this.resourceLoader, this.environment);delegate.registerRepositoriesIn(registry, getRepositoryConfigurationExtension());
}

上述registerBeanDefinitions方法是被ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsFromRegistrars方法所调用,此类是spring初始化bean及相关类的核心。

	private void loadBeanDefinitionsFromRegistrars(Map<ImportBeanDefinitionRegistrar, AnnotationMetadata> registrars) {registrars.forEach((registrar, metadata) ->registrar.registerBeanDefinitions(metadata, this.registry, this.importBeanNameGenerator));}
四、RedisMessageListenerContainer容器初始化相关默认值
class RedisRepositoriesRegistrar extends AbstractRepositoryConfigurationSourceSupport {@Overrideprotected Class<? extends Annotation> getAnnotation() {return EnableRedisRepositories.class;}@Overrideprotected Class<?> getConfiguration() {return EnableRedisRepositoriesConfiguration.class;}@Overrideprotected RepositoryConfigurationExtension getRepositoryConfigurationExtension() {return new RedisRepositoryConfigurationExtension();}@EnableRedisRepositoriesprivate static final class EnableRedisRepositoriesConfiguration {}}

RedisRepositoriesRegistrar类是RedisMessageListenerContainer监听器容器类的初始化起点类,会读取@EnableRedisRepositories注解的属性配置,如果项目中未显式使用此注解则读取默认值,如:redisTemplateRef属性默认引用别名为redisTemplate的模板类。

五、如何开启Spring Data Redis Repositories仓储
  • 方案一:
/**
* 通过在配置类上添加次注解
**/
@EnableRedisRepositories
  • 方案二:
/**
* 通过spring.data.redis.repositories.enabled配置开关
**/
@AutoConfiguration(after = RedisAutoConfiguration.class)
@ConditionalOnClass(EnableRedisRepositories.class)
@ConditionalOnBean(RedisConnectionFactory.class)
@ConditionalOnProperty(prefix = "spring.data.redis.repositories", name = "enabled", havingValue = "true",matchIfMissing = true)
@ConditionalOnMissingBean(RedisRepositoryFactoryBean.class)
@Import(RedisRepositoriesRegistrar.class)
public class RedisRepositoriesAutoConfiguration {}

开源SDK:https://github.com/mingyang66/spring-parent

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 力扣SQL仅数据库(196~569)
  • 剪画:轻松去除图片水印的操作!
  • skywalking服务部署
  • uniapp微信小程序开发测试获取手机号码
  • 对给定数组所对应的二叉树依次完成前序,中序,后序遍历,并输出遍历结果。
  • Vue(十) 过渡动画、配置代理服务器,解决请求跨域的问题
  • 一体化智能电动窗帘:开启智能生活新时尚
  • 大二必做项目贪吃蛇超详解之下篇游戏核心逻辑实现
  • 各业务领域相关方案
  • 华为云征文|Flexus云服务X实例使用,宝塔的安装,利用宝塔安装Java、NGINX,Redis,Python,快速搭建开发环境
  • 遗传算法与深度学习实战(8)——使用遗传算法解决旅行商问题
  • 2025中国(西安)国际雷达技术及设备展览会
  • java【day03】---(Vue-Element)
  • Fastjson1.2.24(CVE-2017-18349)分析
  • Mybatis分页查询主从表
  • 【comparator, comparable】小总结
  • 【css3】浏览器内核及其兼容性
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Create React App 使用
  • Effective Java 笔记(一)
  • Gradle 5.0 正式版发布
  • Javascript弹出层-初探
  • JavaScript异步流程控制的前世今生
  • Java反射-动态类加载和重新加载
  • JS+CSS实现数字滚动
  • JS题目及答案整理
  • ViewService——一种保证客户端与服务端同步的方法
  • 飞驰在Mesos的涡轮引擎上
  • 浅谈web中前端模板引擎的使用
  • 深度解析利用ES6进行Promise封装总结
  • 双管齐下,VMware的容器新战略
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 用Canvas画一棵二叉树
  • 智能网联汽车信息安全
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • #nginx配置案例
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (7)摄像机和云台
  • (备份) esp32 GPIO
  • (二) 初入MySQL 【数据库管理】
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (含笔试题)深度解析数据在内存中的存储
  • (每日一问)基础知识:堆与栈的区别
  • (十二)Flink Table API
  • (数据结构)顺序表的定义
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)创业家杂志:UCWEB天使第一步
  • (转)关于多人操作数据的处理策略
  • (转)详解PHP处理密码的几种方式
  • (转)原始图像数据和PDF中的图像数据
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?