[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.기본 캐시 해결 구현을 확인 했으므로 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.정적 클래스 함수가있는 경우에는 다음과 같이 작동합니다.
정적 클래스 함수가있는 경우에는 다음과 같이 작동합니다.
@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); } }
from https://stackoverflow.com/questions/11396911/using-spring-beans-as-a-key-with-cacheable-annotation by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 실시간 통지 전자 메일을 구현하기위한 Quartz와의 Full Spring 통합 (0) | 2019.04.03 |
---|---|
[SPRING] 자바에서 반사에 의해 setter 메서드를 호출하는 방법 (0) | 2019.04.03 |
[SPRING] 스프링 부트 액추에이터 엔드 포인트의 JSON 출력을 멋지게 출력 (0) | 2019.04.02 |
[SPRING] 봄의 PropertyPlaceHolder (0) | 2019.04.02 |
[SPRING] Spring Boot - Hibernate 커스텀 제약이 서비스를 삽입하지 않는다. (0) | 2019.04.02 |