Как заставить Spring @Cacheable работать поверх аспекта AspectJ?

Я создал аспект AspectJ, который отлично работает в приложении Spring. Теперь я хочу добавить кэширование, используя аннотацию Spring 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 работать поверх него?


person manonthemat    schedule 19.08.2016    source источник


Ответы (1)


Вы можете добиться аналогичных результатов, используя регулярный механизм внедрения зависимостей 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();
    }
}
person Ori Dar    schedule 19.08.2016
comment
Я закончил что-то подобное, но это не так приятно, как просто добавить аннотацию, и это просто работает. Спасибо за усилия, хотя. - person manonthemat; 22.08.2016