RedisMessageListenerContainer容器初始化

embedded/2025/1/16 4:04:01/

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

RedisMessageListenerContainer_4">一、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_73">四、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


http://www.ppmy.cn/embedded/105594.html

相关文章

每日刷题(图论)

P1119 灾后重建 P1119 灾后重建 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 看数据范围知道需要用到Floyd算法&#xff0c;但是道路是不能直接用的&#xff0c;需要等到连接道路的两个村庄重建好才可以使用&#xff0c;所以这需要按照时间依次加入中转点&#xff0c…

collections 学习笔记

collections 学习笔记 collections模块集结了Python中的高性能的容器数据类型&#xff0c;这些数据类型主要包括&#xff1a;namedtuple()、deque、Counter、OrderedDiect、defaultdict。他们作为替换内建&#xff08;built-in&#xff09;容器数据类型dict、list、set、tuple…

java和js计算文件的SHA-256哈希值

需求 需要做分片上传&#xff0c;需要在分片合成文件之后校验这个合成的文件是否和上传的一直&#xff0c;具体就是对文件取hash值&#xff0c;于是选择SHA-256取文件哈希值&#xff0c;自己测试之后没问题&#xff0c;特此分享 前端js下使用SHA-256取文件文件哈希值&#xf…

yolo8 目标检测、鉴黄

引言 目标检测是计算机视觉中的一个关键任务,其目标是在图像中识别出各种对象,并准确地定位其位置。近年来,目标检测技术取得了显著进展,尤其是在深度学习的推动下,性能得到了极大的提升。YOLO(You Only Look Once)系列模型作为目标检测领域的重要代表,其创新性的设计…

【Qt窗口】—— 对话框

目录 &#xff08;一&#xff09; 对话框介绍 &#xff08;二&#xff09;对话框的分类 2.1 模态对话框 2.2 非模态对话框 2.3 混合属性对话框 &#xff08;三&#xff09;内置对话框 消息对话框 QMessageBox 颜色对话框 QColorDialog 字体对话框 QFontDialog 输入对…

【赵渝强老师】MongoDB的MMAPv1存储引擎

在MongoDB 3.2版本以前&#xff0c;MongoDB使用MMAPv1作为默认的存储引擎。在MMAPv1的存储引擎中&#xff0c;包含以下的组成部分&#xff1a; Database 每个Database由一个.ns名称空间文件及若干个数据文件组成。数据文件从0开始编号&#xff0c;依次为.0、.1、.2等。数据文件…

浅谈大模型生成类应用的需求分析设计与实践

在人工智能技术飞速发展的今天&#xff0c;基于大模型的生成类应用已经成为业界关注的焦点。这些应用不仅可以帮助企业提高生产效率&#xff0c;还能为用户提供更加个性化、智能化的服务体验。本文将探讨生成类应用的机遇与挑战&#xff0c;以及在实际落地过程中的探索和实践经…

【网络安全】漏洞挖掘

漏洞描述 Spring框架为现代基于java的企业应用程序(在任何类型的部署平台上)提供了一个全面的编程和配置模型。 Spring Cloud 中的 serveless框架 Spring Cloud Function 中的 RoutingFunction 类的 apply 方法将请求头中的“spring.cloud.function.routing-expression”参数…