副问题[/!--empirenews.page--]
择要
一般开拓中,必要用到各类百般的框架来实现API、体系的构建。作为措施员,除了会行使框架还必必要相识框架事变的道理。这样可以便于我们排盘查题,和自界说的扩展。那么怎样去进修框架呢。凡是我们通过阅读文档、查察源码,然后又很快健忘。始终不能融汇意会。本文首要基于Spring Cache扩展为例,先容怎样举办高效的源码阅读。
SpringCache的先容
为什么以Spring Cache为例呢,缘故起因有两个
- Spring框架是web开拓最常用的框架,值得开拓者去阅读代码,接收头脑
- 缓存是企业级应用开拓必不行少的,而跟着体系的迭代,我们也许会必要用到内存缓存、漫衍式缓存。那么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。当必要提供接口给外部挪用,起首本身内部的实现也必需基于同样一套抽象机制
- 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,会凭证指定的次序去实现
- 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):
- 1.Generic
- 2.JCache (JSR-107) (EhCache 3, Hazelcast, Infinispan, and others)
- 3.EhCache 2.x
- 4.Hazelcast
- 5.Infinispan
- 6.Couchbase
- 7.Redis
- 8.Caffeine
- 9.Simple
step2 run demo
对Spring Cache有了一个或许的相识后,我们起首行使起来,跑个demo。
界说一个用户查询要领
- @Component
- public class CacheSample {
- @Cacheable(cacheNames = "users")
- public Map<Long, User> getUser(final Collection<Long> userIds) {
- System.out.println("not cache");
- final Map<Long, User> mapUser = new HashMap<>();
- userIds.forEach(userId -> {
- mapUser.put(userId, User.builder().userId(userId).name("name").build());
- });
- return mapUser;
- }
设置一个CacheManager
- @Configuration
- public class CacheConfig {
- @Primary
- @Bean(name = { "cacheManager" })
- public CacheManager getCache() {
- return new ConcurrentMapCacheManager("users");
- }
API挪用
- @RestController
- @RequestMapping("/api/cache")
- public class CacheController {
- @Autowired
- private CacheSample cacheSample;
- @GetMapping("/user/v1/1")
- public List<User> getUser() {
- return cacheSample.getUser(Arrays.asList(1L,2L)).values().stream().collect(Collectors.toList());
- }
- }
step3 debug 查察实现
(编辑:河北网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|