加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

如何进行高效的源码阅读:以Spring Cache扩展为例带你搞清楚

发布时间:2019-07-27 00:45:29 所属栏目:建站 来源:三旬老汉
导读:摘要 日常开发中,需要用到各种各样的框架来实现API、系统的构建。作为程序员,除了会使用框架还必须要了解框架工作的原理。这样可以便于我们排查问题,和自定义的扩展。那么如何去学习框架呢。通常我们通过阅读文档、查看源码,然后又很快忘记。始终不能
副标题[/!--empirenews.page--]

摘要

日常开发中,需要用到各种各样的框架来实现API、系统的构建。作为程序员,除了会使用框架还必须要了解框架工作的原理。这样可以便于我们排查问题,和自定义的扩展。那么如何去学习框架呢。通常我们通过阅读文档、查看源码,然后又很快忘记。始终不能融汇贯通。本文主要基于Spring Cache扩展为例,介绍如何进行高效的源码阅读。

SpringCache的介绍

为什么以Spring Cache为例呢,原因有两个

  1. Spring框架是web开发最常用的框架,值得开发者去阅读代码,吸收思想
  2. 缓存是企业级应用开发必不可少的,而随着系统的迭代,我们可能会需要用到内存缓存、分布式缓存。那么Spring Cache作为胶水层,能够屏蔽掉我们底层的缓存实现。

一句话解释Spring Cache: 通过注解的方式,利用AOP的思想来解放缓存的管理。

step1 查看文档

首先通过查看官方文档,概括了解Spring Cache
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-caching.html

重点两点

1. 两个接口抽象 Cache,CacheManager,具体的实现都是基于这两个抽象实现。
典型的SPI机制,和eat your dog food。当需要提供接口给外部调用,首先自己内部的实现也必须基于同样一套抽象机制

  1. The cache abstraction does not provide an actual store and relies on abstraction materialized by the org.springframework.cache.Cache and org.springframework.cache.CacheManager interfaces. 

2. Spring Cache提供了这些缓存的实现,如果没有一种CacheManage,或者CacheResolver,会按照指定的顺序去实现

  1. If you have not defined a bean of type CacheManager or a CacheResolver named cacheResolver (see CachingConfigurer), Spring Boot tries to detect the following providers (in the indicated order): 
  2. 1.Generic 
  3. 2.JCache (JSR-107) (EhCache 3, Hazelcast, Infinispan, and others) 
  4. 3.EhCache 2.x 
  5. 4.Hazelcast 
  6. 5.Infinispan 
  7. 6.Couchbase 
  8. 7.Redis 
  9. 8.Caffeine 
  10. 9.Simple 

step2 run demo

对Spring Cache有了一个大概的了解后,我们首先使用起来,跑个demo。

定义一个用户查询方法

  1. @Component 
  2. public class CacheSample { 
  3.     @Cacheable(cacheNames = "users") 
  4.     public Map<Long, User> getUser(final Collection<Long> userIds) { 
  5.         System.out.println("not cache"); 
  6.         final Map<Long, User> mapUser = new HashMap<>(); 
  7.         userIds.forEach(userId -> { 
  8.             mapUser.put(userId, User.builder().userId(userId).name("name").build()); 
  9.         }); 
  10.         return mapUser; 
  11.     } 

配置一个CacheManager

  1. @Configuration 
  2. public class CacheConfig { 
  3.     @Primary 
  4.     @Bean(name = { "cacheManager" }) 
  5.     public CacheManager getCache() { 
  6.       return new ConcurrentMapCacheManager("users"); 
  7.     } 

API调用

  1. @RestController 
  2. @RequestMapping("/api/cache") 
  3. public class CacheController { 
  4.     @Autowired 
  5.     private CacheSample cacheSample; 
  6.     @GetMapping("/user/v1/1") 
  7.     public List<User> getUser() { 
  8.         return cacheSample.getUser(Arrays.asList(1L,2L)).values().stream().collect(Collectors.toList()); 
  9.     } 
  10.     } 

step3 debug 查看实现

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读