下面是一个较为详细的spring缓存的介绍
http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/
Cacheable注解,是spring支持的一个注解,用法就不多说了,但是发现了一个奇怪的用法,Cacheable的value属性官方定义为缓存的名字,但是在这里却被当成了缓存的失效时长。
/** * http请求获取城市列表 */ @Override @Cacheable(value = "86400", key = "'***_city_list'") public CityListModel getCities() { String cities; ...... }
这就需要研究下自定义spring缓存的步骤
1.自定义CacheManager
2.自定义Cache
其中CacheManager.getCache方法的入参的含义是缓存的名字,就是Cacheable注解的value值,接下来思路就清晰了,通过获取getCache(String name)的name(实际上是超时时间)对缓存的操作,就实现了上面的功能。
package org.springframework.cache; public interface CacheManager { /** * Return the cache associated with the given name. * @param name the cache identifier (must not be {@code null}) * @return the associated cache, or {@code null} if none found */ Cache getCache(String name); /** * Return a collection of the cache names known by this manager. * @return the names of all caches known by the cache manager */ Collection<String> getCacheNames(); }
package org.springframework.cache; public interface Cache {...}
下面是CacheManager的实现类,根据一个ConcurrentMap(key超时时间,value对应相应的缓存),MedisConcurrentCache封装了缓存的超时操作,用一种很巧妙的方式给Cacheable增加了超时的功能。
public class MedisConcurrentCacheManager extends AbstractConcurrentCacheManager implements InitializingBean { private static final Logger LOGGER = LoggerFactory.getLogger(MedisConcurrentCacheManager.class); private MedisConcurrentCache cache; private String nameSpace; private IMedis meids; private ConcurrentMap<Integer, MedisConcurrentCache> cachedCaches = Maps.newConcurrentMap(); public void setCache(MedisConcurrentCache cache) { this.cache = cache; } @Override public Cache getCache(String expire) { try { if (StringUtils.isBlank(expire)) { return cache; } for (char c : expire.toCharArray()) { if (!Character.isDigit(c)) { return cache; } } int expireInt = Integer.valueOf(expire); MedisConcurrentCache cache = cachedCaches.get(expireInt); if (null == cache) { cache = new MedisConcurrentCache(); cache.setExpireTime(expireInt); cache.setMedis(meids); cache.setNameSpace(nameSpace); cachedCaches.putIfAbsent(expireInt, cache); cache = cachedCaches.get(expireInt); } return cache; } catch (Exception e) { LOGGER.error(e.getMessage(), e); } return cache; } 。。。。。。 }
下面是spring的配置
<bean id="cacheManager" class="com.meituan.service.mobile.movie.cache.impl.MedisConcurrentCacheManager"> <property name="cache" ref="cache"/> </bean> <cache:annotation-driven cache-manager="cacheManager" proxy-target-class="true"/> <import resource="classpath:rediscloud-auth-test.xml"/> <bean id="cache" class="com.meituan.service.mobile.movie.cache.impl.MedisConcurrentCache"> <property name="medis" ref="medis"/> <property name="nameSpace" value="apollosupplier:"/> </bean> <bean id="medis" class="com.meituan.cache.redisCluster.client.MedisBean"> <property name="authDao" ref="zkAuthDao"/> <property name="poolId" value="mobile-apollo-item-cache01"/> <property name="authKey" value="gE9rVsIOG2Rh5y2dcAOW"/> </bean>
相关推荐
Spring Security 是一个强大的Java安全框架,...通过这个项目,你可以深入理解Spring Security的工作原理,并学习如何自定义其核心组件。如果你对码云不熟悉,也可以选择其他版本控制系统,如Git,进行代码托管和协作。
本文将深入探讨如何结合Spring MVC和Spring Security来实现自定义登录功能。 首先,Spring MVC是Spring框架的一部分,它为构建基于HTTP的Web应用程序提供了模型-视图-控制器架构。通过使用Spring MVC,开发者可以...
在Spring AOP(面向切面编程)中,自定义切面是实现业务逻辑解耦、增强代码可维护性的重要手段。AspectJ是一个强大的面向切面的编程库,它提供了与Spring AOP集成的能力,使我们可以编写更为灵活和模块化的代码。...
3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑...
在Spring框架中,自定义注解的解析是一个强大的特性,允许开发者根据业务需求创建特定的注解,并在Spring容器启动时自动处理这些注解。本文将深入探讨如何在Spring环境中通过`component-scan`配置来处理自定义Java...
在Spring框架中,自定义标签是一项非常实用的功能,它允许我们创建符合XML语法的自定义元素,以便在配置文件中更方便地表达业务逻辑。在"spring自定义标签例子"这个项目中,我们可以深入理解这一特性,特别是通过...
在Spring框架中,自定义注解(Annotation)和AOP(面向切面编程)的结合使用,极大地增强了代码的可读性和可维护性。本文将深入探讨如何在Spring中创建自定义注解以及如何在AOP中有效地获取并利用这些注解。 首先,...
Java微服务实践-Spring Boot自定义启动器 Java微服务实践是当前流行的软件架构风格,旨在将应用程序拆分成多个小型的、独立的服务,以提高系统的可扩展性、灵活性和可维护性。Spring Boot是当前最流行的Java微服务...
在Spring框架中,属性编辑器(PropertyEditor)是一种强大的工具,允许我们自定义类型转换过程。当我们需要将字符串形式的数据转换为Java对象时,属性编辑器就发挥了关键作用。例如,从请求参数或配置文件中读取的...
为了提供更友好的用户体验,Spring Boot允许我们自定义这些错误页面,而不是显示默认的Spring Boot错误页面。这篇博文的资源包含了三个自定义错误页面文件:404.html、500.html和401.html,分别对应HTTP状态码404、...
本资源“spring-security实现自定义登录认证.rar”包含了一个使用Spring Security进行登录认证的示例,以及JWT(JSON Web Tokens)与Spring Security集成的代码。 首先,让我们了解Spring Security的基本工作原理。...
在Spring Security框架中,自定义过滤器是实现特定安全需求的一种常见方式。Spring Security的核心功能是通过一系列的Filter链来处理HTTP请求,这些Filter包括认证、授权等关键操作。本篇我们将深入探讨如何在Spring...
本文将详细介绍如何在Spring项目中自定义Session管理以及如何使用SpringSession。 一、SpringSession简介 SpringSession是一个开源项目,它扩展了Spring MVC和Spring WebFlux,以支持基于Redis、MongoDB、Hazelcast...
本篇文章将深入探讨如何利用Spring Context上下文来创建自定义对象,并理解控制反转的原理。 首先,让我们了解什么是Spring Context。Spring Context是Spring框架的应用上下文,它充当了全局容器,存储了应用的所有...
Spring Boot 自定义starter启动器 Demo 部分,用于记录使用。该demo 配套教程 https://blog.csdn.net/lzb348110175/article/details/105330274。
Spring Boot自定义异常内容代码,用来自定义异常展示信息,添加需要展示的信息等,并满足自适应显示。浏览器访问出现异常返回 Hmtl页面,客户端访问出现异常返回 Json 数据。该 Demo 仅用作备份
在Spring Security 4中,我们可以通过自定义过滤器来扩展其功能,以满足特定的安全需求。在这个小例子中,我们将探讨如何创建并集成自定义过滤器,以及它在Spring Security中的工作原理。 首先,我们需要理解Spring...
在Spring AOP(面向切面编程)中,自定义缓存是一种常见的优化技术,它可以显著提高应用程序的性能,减少对数据库或远程服务的重复访问。本实例将介绍如何利用Spring AOP来实现自定义缓存功能。 首先,理解Spring ...
**Spring Security 自定义数据库小项目概述** Spring Security 是一个强大且高度可定制的身份验证和访问控制框架,用于保护 Java 应用程序。本项目旨在演示如何利用 Spring Security 的灵活性,将权限管理与数据库...