使用AOP实现方法入参和对应的出参缓存功能,可以通过在方法执行前后分别进行拦截并缓存参数和返回值来实现。具体实现步骤如下:
1. 定义一个缓存类`Cache`,用于存储方法参数和对应的返回值。
```java
public class Cache {
private Map cacheMap = new HashMap<>();
public void put(String key, Object value) {
cacheMap.put(key, value);
}
public Object get(String key) {
return cacheMap.get(key);
}
}
```
2. 定义一个切面类`CacheAspect`,用于实现缓存功能。
```java
@Aspect
@Component
public class CacheAspect {
private Cache cache = new Cache();
@Around("@annotation(com.example.demo.Cacheable)")
public Object cache(ProceedingJoinPoint joinPoint) throws Throwable {
// 获取方法名和参数列表
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
// 生成缓存key
String key = methodName + Arrays.toString(args);
// 判断缓存中是否存在该key
Object result = cache.get(key);
if (result != null) {
System.out.println("从缓存中获取数据:" + result);
return result;
}
// 执行目标方法,并缓存结果
result = joinPoint.proceed();
cache.put(key, result);
System.out.println("将数据放入缓存:" + result);
return result;
}
}
```
在上述代码中,我们使用了`@Around`注解来定义一个环绕通知,该通知会拦截所有被`@Cacheable`注解修饰的方法。在通知中,我们首先获取方法名和参数列表,并根据它们生成一个缓存key。然后判断缓存中是否存在该key,如果存在则直接返回缓存结果,否则执行目标方法并将结果缓存起来。
3. 在需要使用缓存功能的方法上添加`@