JetCache源码解析——配置加载

2024-01-07 01:20

本文主要是介绍JetCache源码解析——配置加载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JetCache自动化配置加载

JetCache的配置加载主要是在jetcache-autoconfigure模块中完成的,无论是使用内存缓存LinkedHashMap和caffeine,亦或是通过lettuce、redisson和spring-data-redis来操作Redis服务缓存数据,其自动加载配置的操作基本上都是相似的。

例如LinkedHashMapAutoConfiguration完成LinkedHashMap类型的缓存初始化操作,源码如下:

/*** LinkedHashMap自动配置类*/
@Component
@Conditional(LinkedHashMapAutoConfiguration.LinkedHashMapCondition.class)
public class LinkedHashMapAutoConfiguration extends EmbeddedCacheAutoInit {public LinkedHashMapAutoConfiguration() {super("linkedhashmap");}@Override/*** 初始化缓存* @param ct            配置树* @param cacheAreaWithPrefix    缓存区域名称(包括前缀)* @return              初始化后的缓存*/protected CacheBuilder initCache(ConfigTree ct, String cacheAreaWithPrefix) {LinkedHashMapCacheBuilder builder = LinkedHashMapCacheBuilder.createLinkedHashMapCacheBuilder();parseGeneralConfig(builder, ct);return builder;}/*** LinkedHashMap条件类*/public static class LinkedHashMapCondition extends JetCacheCondition {public LinkedHashMapCondition() {super("linkedhashmap");}}
}

其中LinkedHashMapCondition是一个自定义的条件类,如果spring boot项目的application.yml文件中jetcache.local.${areaName} .type或jetcache.remote.${areaName}.type为linkedhashmap时,就会构建LinkedHashMapAutoConfiguration对应的bean,JetCacheCondition类的源码如下:

public abstract class JetCacheCondition extends SpringBootCondition {/*** 缓存类型数组*/private String[] cacheTypes;/*** 构造方法* @param cacheTypes 缓存类型数组*/protected JetCacheCondition(String... cacheTypes) {Objects.requireNonNull(cacheTypes, "cacheTypes can't be null");Assert.isTrue(cacheTypes.length > 0, "cacheTypes length is 0");this.cacheTypes = cacheTypes;}/*** 判断条件是否匹配* @param conditionContext 条件上下文* @param annotatedTypeMetadata 注解类型元数据* @return 匹配结果*/@Overridepublic ConditionOutcome getMatchOutcome(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {ConfigTree ct = new ConfigTree((ConfigurableEnvironment) conditionContext.getEnvironment(), "jetcache.");if (match(ct, "local.") || match(ct, "remote.")) {return ConditionOutcome.match();} else {return ConditionOutcome.noMatch("no match for " + cacheTypes[0]);}}/*** 判断是否匹配指定前缀* @param ct 配置树* @param prefix 前缀* @return 是否匹配*/private boolean match(ConfigTree ct, String prefix) {Map<String, Object> m = ct.subTree(prefix).getProperties();Set<String> cacheAreaNames = m.keySet().stream().map((s) -> s.substring(0, s.indexOf('.'))).collect(Collectors.toSet());final List<String> cacheTypesList = Arrays.asList(cacheTypes);return cacheAreaNames.stream().anyMatch((s) -> cacheTypesList.contains(m.get(s + ".type")));}
}

同理,如果想要使用redisson或lettuce中间件来进行远程缓存的处理,则对应的自动化配置类的源码如下:

@Configuration
@Conditional(RedissonAutoConfiguration.RedissonCondition.class)
public class RedissonAutoConfiguration {private static final String CACHE_TYPE = "redisson";public static class RedissonCondition extends JetCacheCondition {public RedissonCondition() {super(CACHE_TYPE);}}@Beanpublic RedissonAutoInit redissonAutoInit() {return new RedissonAutoInit();}
}

在上面的RedissonAutoConfiguration.RedissonCondition条件类中对应的cacheTypes为redisson,即当spring boot项目的application.yml文件中jetcache.local.${areaName} .type或jetcache.remote.${areaName}.type为redisson时,就会构建RedissonAutoConfiguration对应的bean。

同理,加载lettuce对应的自动化加载的源码如下:

@Configuration
@Conditional(RedisLettuceAutoConfiguration.RedisLettuceCondition.class)
public class RedisLettuceAutoConfiguration {public static final String AUTO_INIT_BEAN_NAME = "redisLettuceAutoInit";public static class RedisLettuceCondition extends JetCacheCondition {public RedisLettuceCondition() {super("redis.lettuce");}}@Bean(name = {AUTO_INIT_BEAN_NAME})public RedisLettuceAutoInit redisLettuceAutoInit() {return new RedisLettuceAutoInit();}
}

JetCache自动初始化

JetCache的自动化的类图如下:

内存缓存自动初始化

LinkedHashMapAutoConfiguration类是基于LinkedHashMap来创建的内存缓存自动配置类,该类继承自EmbeddedCacheAutoInit抽象类,该类重写了initCache方法,用于内存缓存的初始化操作,该方法会创建用于创建LinkedHashMap类型的内存缓存的创建者,并调用parseGeneralConfig方法解析JetCache的配置。源码如下:

    /*** 重写方法,用于初始化缓存* @param ct 缓存的配置树* @param cacheAreaWithPrefix 缓存区服(包括前缀)* @return 返回构建好的缓存*/@Overrideprotected CacheBuilder initCache(ConfigTree ct, String cacheAreaWithPrefix) {LinkedHashMapCacheBuilder builder = LinkedHashMapCacheBuilder.createLinkedHashMapCacheBuilder();parseGeneralConfig(builder, ct);return builder;}

创建LinkerHashMap类型的缓存构建者的源码如下:

public class LinkedHashMapCacheBuilder<T extends EmbeddedCacheBuilder<T>> extends EmbeddedCacheBuilder<T> {/*** LinkedHashMapCacheBuilder的内部类*/public static class LinkedHashMapCacheBuilderImpl extends LinkedHashMapCacheBuilder<LinkedHashMapCacheBuilderImpl> {}/*** 创建一个LinkedHashMapCacheBuilderImpl实例* * @return 返回LinkedHashMapCacheBuilderImpl实例*/public static LinkedHashMapCacheBuilderImpl createLinkedHashMapCacheBuilder() {return new LinkedHashMapCacheBuilderImpl();}/*** 私有构造方法*/protected LinkedHashMapCacheBuilder() {buildFunc((c) -> new LinkedHashMapCache((EmbeddedCacheConfig) c));}
}

在上面构建的LinkedHashMapCacheBuilder实例时,LinkedHashMapCacheBuilder的构造函数会初始化相应的缓存类LinkedHashMapCache。这里紧急简单介绍一下,后面会详细就缓存构建者进行描述。

CaffeineAutoConfiguration类是基于Caffeine来创建的内存缓存自动配置类,该类继承自EmbeddedCacheAutoInit抽象类,该类重写了initCache方法,该方法会创建用于创建Caffeine类型的内存缓存的创建者,并调用parseGeneralConfig方法解析JetCache的配置。源码如下:

@Overrideprotected CacheBuilder initCache(ConfigTree ct, String cacheAreaWithPrefix) {CaffeineCacheBuilder builder = CaffeineCacheBuilder.createCaffeineCacheBuilder();parseGeneralConfig(builder, ct);return builder;}

同样,关于构建CaffeineCacheBuilder相应的代码逻辑也放在后面再进行介绍。

内存缓存LinkedHashMap和caffeine的自动初始化类都是继承自EmbeddedCacheAutoInit抽象类,主要是解析配置的内存缓存的最大缓存数量。EmbeddedCacheAutoInit类的源码如下:

public abstract class EmbeddedCacheAutoInit extends AbstractCacheAutoInit {public EmbeddedCacheAutoInit(String... cacheTypes) {super(cacheTypes);}@Overrideprotected void parseGeneralConfig(CacheBuilder builder, ConfigTree ct) {super.parseGeneralConfig(builder, ct);EmbeddedCacheBuilder ecb = (EmbeddedCacheBuilder) builder;ecb.limit(Integer.parseInt(ct.getProperty("limit", String.valueOf(CacheConsts.DEFAULT_LOCAL_LIMIT))));}
}

解析配置文件的逻辑放到下面的JetCache配置解析章节进行讲述,这里不做过多描述。

Redis缓存自动初始化

在RedissonAutoConfiguration类中,redissonAutoInit()函数会创建RedissonAutoInit对应的bean,类RedissonAutoInit继承自ExternalCacheAutoInit类,通过重写initCache方法,该方法会创建用于创建Redisson类型的内存缓存的创建者RedissonCacheBuilder,并调用parseGeneralConfig方法解析JetCache的配置。下面会详细介绍不同类型的Redis缓存的初始化逻辑。

RedissonAutoInit

待完善…………

RedisLettuceAutoInit

待完善…………

JetCache缓存构建者

待完善…………

JetCache配置加载

待完善…………

这篇关于JetCache源码解析——配置加载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/578274

相关文章

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

springboot security之前后端分离配置方式

《springbootsecurity之前后端分离配置方式》:本文主要介绍springbootsecurity之前后端分离配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录前言自定义配置认证失败自定义处理登录相关接口匿名访问前置文章总结前言spring boot secu

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则