我创建了一个AspectJ方面,该方面在spring应用程序中运行良好。现在,我想使用springs Cacheable注释添加缓存。

为了检查@Cacheable是否被拾取,我使用的是不存在的缓存管理器的名称。常规的运行时行为是引发异常。但是在这种情况下,不会引发任何异常,这表明@Cacheable注释未应用于拦截对象。

/* { package, some more imports... } */

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.cache.annotation.Cacheable;

@Aspect
public class GetPropertyInterceptor
{
    @Around( "call(* *.getProperty(..))" )
    @Cacheable( cacheManager = "nonExistingCacheManager", value = "thisShouldBlowUp", key = "#nosuchkey" )
    public Object intercepting( ProceedingJoinPoint pjp ) throws Throwable
    {
        Object o;
        /* { modify o } */
        return o;
    }
}

鉴于我的Aspect已经在工作,如何使@Cacheable在其之上工作?

最佳答案

通过使用Spring常规依赖项注入机制并将org.springframework.cache.CacheManager注入您的方面,您可以实现类似的结果:

@Autowired
CacheManager cacheManager;

然后,您可以在周围的建议中使用缓存管理器:
@Around( "call(* *.getProperty(..))" )
public Object intercepting( ProceedingJoinPoint pjp ) throws Throwable
{
    Cache cache = cacheManager.getCache("aopCache");
    String key = "whatEverKeyYouGenerateFromPjp";
    Cache.ValueWrapper valueWrapper = cache.get(key);
    if (valueWrapper == null) {
        Object o;
        /* { modify o } */
        cache.put(key, o);
        return o;
    }
    else {
        return valueWrapper.get();
    }
}

10-05 23:17