복붙노트

[SPRING] @Cacheable 주석을 사용하여 스프링 빈을 키로 사용하기

SPRING

@Cacheable 주석을 사용하여 스프링 빈을 키로 사용하기

다음을 수행하는 방법 : - @Cacheable 주석으로 캐싱되어야하는 메소드가있는 스프링 빈 - 캐시 용 키를 생성하는 다른 스프링 빈 (KeyCreatorBean).

코드는 다음과 같습니다.

@Inject
private KeyCreatorBean keyCreatorBean;

@Cacheable(value = "cacheName", key = "{@keyCreatorBean.createKey, #p0}")
@Override
public List<Examples> getExamples(ExampleId exampleId) {
  ...

그러나 위 코드는 작동하지 않습니다. 다음과 같은 예외가 있습니다.

Caused by: org.springframework.expression.spel.SpelEvaluationException: 
    EL1057E:(pos 2): No bean resolver registered in the context to resolve access to bean 'keyCreatorBean'

해결법

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

    1.기본 캐시 해결 구현을 확인 했으므로 bean을 해석하고 @ beanname.method와 같은 표현식을 평가하는 데 필요한 BeanResolver를 주입하는 간단한 방법이없는 것 같습니다.

    기본 캐시 해결 구현을 확인 했으므로 bean을 해석하고 @ beanname.method와 같은 표현식을 평가하는 데 필요한 BeanResolver를 주입하는 간단한 방법이없는 것 같습니다.

    그래서 @micfra가 추천 한 줄을 따라 다소 해로운 방법을 추천한다.

    그가 말했듯이,이 라인들에 따라 KeyCreatorBean을 가지지 만, 애플리케이션에 등록한 keycreatorBean에 내부적으로 위임합니다 :

    package pkg.beans;
    
    import org.springframework.stereotype.Repository;
    
    public class KeyCreatorBean  implements ApplicationContextAware{
        private static ApplicationContext aCtx;
        public void setApplicationContext(ApplicationContext aCtx){
            KeyCreatorBean.aCtx = aCtx;
        }
    
    
        public static Object createKey(Object target, Method method, Object... params) {
            //store the bean somewhere..showing it like this purely to demonstrate..
            return aCtx.getBean("keyCreatorBean").createKey(target, method, params);
        }
    
    }
    
  2. ==============================

    2.정적 클래스 함수가있는 경우에는 다음과 같이 작동합니다.

    정적 클래스 함수가있는 경우에는 다음과 같이 작동합니다.

    @Cacheable(value = "cacheName", key = "T(pkg.beans.KeyCreatorBean).createKey(#p0)")
    @Override
    public List<Examples> getExamples(ExampleId exampleId) {
      ...
    }
    

    package pkg.beans;
    
    import org.springframework.stereotype.Repository;
    
    public class KeyCreatorBean  {
    
        public static Object createKey(Object o) {
            return Integer.valueOf((o != null) ? o.hashCode() : 53);
        }
    
    }
    
  3. from https://stackoverflow.com/questions/11396911/using-spring-beans-as-a-key-with-cacheable-annotation by cc-by-sa and MIT license