Spring Boot提供了多种缓存方法返回值的方式,其中比较常见且容易实现的有自定义注解和使用Spring Cache。
1. 使用自定义注解:
- 首先,需要定义一个自定义注解。可以命名为`@MethodCache`。
- 将此注解标记在需要缓存返回值的方法上,当调用该方法时,方法的返回值将被缓存起来。
- 编写一个切面类,通过切面拦截带有`@MethodCache`注解的方法,并进行缓存处理。
- 在切面中,根据方法的参数生成一个唯一的缓存键,然后查询缓存池。
- 如果缓存池中已存在对应的缓存值,则直接返回缓存值,否则执行方法并将返回值放入缓存池中。
示例代码如下:// 自定义注解@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD})public @interface MethodCache {}// 切面类@Aspect@Componentpublic class MethodCacheAspect { private static final Map<String, Object> CACHE_MAP = new ConcurrentHashMap<>(); @Around("@annotation(methodCache)") public Object around(ProceedingJoinPoint pjp, MethodCache methodCache) throws Throwable { String key = generateCacheKey(pjp); Object cache = getFromCache(key); if (cache != null) { return cache; } else { Object result = pjp.proceed(); putIntoCache(key, result); return result; } } private String generateCacheKey(ProceedingJoinPoint pjp) { String className = pjp.getSignature().getDeclaringType().getSimpleName(); String methodName = pjp.getSignature().getName(); String params = Arrays.toString(pjp.getArgs()); return className + ":" + methodName + ":" + params; } private Object getFromCache(String key) { return CACHE_MAP.get(key); } private void putIntoCache(String key, Object value) { CACHE_MAP.put(key, value); }}// 使用注解标记需要缓存的方法@RestControllerpublic class MyController { @MethodCache @GetMapping("/cached") public String getCachedData() { // 从数据库或其他数据源中获取数据 return "Cached Data"; }}
2. 使用Spring Cache:
- 首先,在启动类上添加`@EnableCaching`注解开启Spring Cache功能。
- 在需要缓存返回值的方法上使用`@Cacheable`注解,指定缓存的名称和key。
- Spring Cache会自动在方法调用时,根据缓存名称和key来查找对应的缓存值,如果存在则直接返回,否则执行方法并将返回值放入缓存中。
示例代码如下:@SpringBootApplication@EnableCachingpublic class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); }}@RestControllerpublic class MyController { @Cacheable(value = "myCache", key = "'cached_data'") @GetMapping("/cached") public String getCachedData() { // 从数据库或其他数据源中获取数据 return "Cached Data"; }}
在上述示例中,`@Cacheable`注解指定了缓存的名称为`myCache`,key为`cached_data`。当调用`/cached`接口时,如果缓存中存在`cached_data`的缓存值,则直接返回该值;否则,执行方法并将返回值放入缓存中。
需要注意的是,使用Spring Cache时,需要配置一个缓存管理器(`CacheManager`),用来管理缓存池和缓存策略。常用的缓存管理器有`ConcurrentMapCacheManager`、`EhCacheCacheManager`、`RedisCacheManager`等,具体选择哪种管理器根据项目需求而定。
这两种方法都可以实现对方法返回值的缓存,选择哪种方式取决于具体场景和需求,以及个人偏好。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。 |