java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > 枚举配置spring cache缓存

多模块项目使用枚举配置spring-cache缓存方案详解

作者:javalover

这篇文章主要为大家介绍了多模块项目使用枚举配置spring-cache缓存的方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一、前言

二、方案

1. 配置缓存:接口 + 枚举 + Lombok

缓存配置接口:

public interface ICacheConfig {
    Integer getTtl();
}

common模块缓存配置(使用 Lombok 的 FieldNameConstants 自动生成 常量):

@lombok.Getter
@lombok.AllArgsConstructor
@lombok.experimental.FieldNameConstants(onlyExplicitlyIncluded = true)
public enum CommonCacheConfig implements ICacheConfig {
    @FieldNameConstants.Include QUOTE_LEVEL(1000, 2);
    private final Integer ttl;
}

业务模块缓存配置:

@lombok.Getter
@lombok.AllArgsConstructor
@lombok.experimental.FieldNameConstants(onlyExplicitlyIncluded = true)
public enum QuoteServiceCacheConfig implements ICacheConfig {
    @FieldNameConstants.Include HOT_STOCK(1000, 30);
    private final Integer ttl;
}

2. 多模块配置加载:Reflections + SimpleCacheManager

SimpleCacheManager 组合 各种不同配置的 缓存

@EnableCaching
@Configuration
public class CacheConfig {
  private Logger log = LoggerFactory.getLogger(this.getClass());
  @Bean
  @Primary
  public CacheManager cacheManager() {
      final SimpleCacheManager cacheManager = new SimpleCacheManager();
      final String prefix = "package";
Set<Class<? extends ICacheConfig>> classes = new Reflections(prefix).getSubTypesOf(ICacheConfig.class);
        log.info("cache types|{}|{}", prefix, classes);
        List<Cache> caches = classes.stream().flatMap(clazz -> Arrays.stream(clazz.getEnumConstants())).map(config -> {
            final Caffeine<Object, Object> cache = Caffeine.newBuilder().recordStats();
            Optional.ofNullable(config.getTtl()).ifPresent(t -> cache.expireAfterWrite(t, TimeUnit.SECONDS));
            return new CaffeineCache(((Enum) config).name(), cache.build());
        }).collect(Collectors.toList());
        cacheManager.setCaches(caches);
        return cacheManager;
    }

3. 使用缓存

使用 Lombok 的 FieldNameConstants 自动生成的 常量:

public enum CommonCacheConfig implements ICacheConfig {
  public static final class Fields {
      public static final String QUOTE_LEVEL = "QUOTE_LEVEL";
  }
}

三、总结

以上就是多模块项目使用枚举配置spring-cache缓存方案详解的详细内容,更多关于枚举配置spring cache缓存的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文