복붙노트

[SPRING] AspectJ aspect 위에 Spring @Cacheable 작업을 만드는 방법은?

SPRING

AspectJ aspect 위에 Spring @Cacheable 작업을 만드는 방법은?

나는 Spring 애플리케이션 내에서 잘 동작하는 AspectJ aspect를 만들었다. 이제 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 작업을 수행하려면 어떻게해야합니까?

해결법

  1. ==============================

    1.Spring의 일반적인 의존성 주입 메커니즘을 사용하고 org.springframework.cache.CacheManager를 aspect에 삽입함으로써 비슷한 결과를 얻을 수있다 :

    Spring의 일반적인 의존성 주입 메커니즘을 사용하고 org.springframework.cache.CacheManager를 aspect에 삽입함으로써 비슷한 결과를 얻을 수있다 :

    @Autowired
    CacheManager cacheManager;
    

    다음 around advice에서 캐시 관리자를 사용할 수있다.

    @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();
        }
    }
    
  2. from https://stackoverflow.com/questions/39047520/how-to-make-spring-cacheable-work-on-top-of-aspectj-aspect by cc-by-sa and MIT license