2010-07-07 2 views
2

나는 두 개의 빈을 자바 @Configuration으로 정의했다. 그들 중 일부는 꽤 긴 계산을 수행하는 메소드를 가지고 있으며 메소드가 호출 될 때마다 계산을하지 않으려면 주어진 인자에 대해 리턴 된 값을 캐시하고 싶습니다.Spring을 사용하여 bean 메소드의 반환 값을 선언적으로 캐싱하기

예 :

@Configuration public class Config { 
    @Bean public CalculatorBean calcBean() { 
     return new CalculatorBean(); 
    } 
} 

public class CalculatorBean { 
    public int hugeCalculation(int arg1, String arg2, double[] arg3) { 
     // ... very long calculation ... 
    } 
} 

적으로는, 내가 정의 @Cached(method="hugeCalculation", size=1000, ttl=36000) 일종의 @Configuration@Bean 방법에 주석을 자동으로 AOP 프록시에 그 콩을 래핑하는 후 처리 빈 공장을 가지고 싶습니다.

이런 종류의 솔루션이 있습니까? 그렇지 않다면, 이것을하기 위해 어떤 클래스의 클래스를 사용해야합니까?

+0

'@ Bean' 주석 메서드는 어쨌든 한 번만 호출해야합니다 (콩이 싱글 톤이라고 가정). 그렇지 않으면 무언가가 잘못 구성되었습니다. 예를 게시하십시오. – skaffman

+0

나는 그 콩의 방법 *을 의미합니다. – Fixpoint

답변

0

하지만 그 전에 나는 다음과 같은 솔루션 생성 : (않습니다

  1. 내가 빈에서 BeanDefinition를 검색된 BeanPostProcessor을 생성하지 다음과 같은 뭔가 초기화 전후의 문제).
  2. BeanDefinition에서 getSource()을 통해 그 빈의 주석 된 메소드 MethodMetadata을 검색했습니다.
  3. 그 MethodMetadata에서 메소드의 주석을 검색했습니다.
  4. 내 맞춤형 @Cached 주석이 포함 된 경우 MethodInterceptor에 해당 빈을 포장하여 필요한 방식으로 캐시 된 결과가 표시됩니다.

어쨌든 Ehcache는 더 나은 솔루션이며, 캐시되어야하는 실제 메소드에 주석을 달아야하지만 스프링 통합도 있습니다. 즉, 선택적으로 캐시를 캐시 할 수 없지만 대부분의 경우 호출이 필요하지 않습니다.

2

값이 실제로 일정하면 CalculatorBeanFactoryBean으로 바꾸는 것이 어떨까요? 정확히 어떻게이 코드가 귀하의 @Configuration과 함께 작동하는지 확신 할 수 없습니다. 나는 그 주석을 사용한 적이 한번도 없습니다.

Integer.class을 반환하고 싱글 톤으로 만든 다음 getObject 메서드에서 계산할 수 있습니다. 내가으로 Ehcache를 사용하여 결국 결국

public class CalculatorBean implements FactoryBean { 
    public Object getObject() { 
     return (Integer)hugeCalculation(...); 
    } 
    public Class getObjectType() { 
     return Integer.class; 
    } 
    public boolean isSingleton() { 
     return true; 
    } 
    private int hugeCalculation(int arg1, String arg2, double[] arg3) { 
     // ... very long calculation ... 
    } 
} 
+0

아니요, 일정하지는 않지만이 경우 실적을 위해 신선함을 바꿀 수 있습니다. – Fixpoint

관련 문제