Spring Cache не работает как свойство вычисления - PullRequest
0 голосов
/ 05 апреля 2020

Я хочу использовать механизм для создания одноразовой вычислительной функции. Я пытаюсь использовать Spring Caching. Но это не работает. Пожалуйста, помогите мне решить эту проблему. Мой код, как показано ниже,

Зависимость от Gradle

compile 'org.springframework.boot:spring-boot-starter-cache'

Основной класс приложения Spring Boot

@SpringBootApplication
@EnableCaching
public class Application {

    public static ApplicationContext applicationContext;

    public static void main(String[] args) {
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
        // todo: Try to save response text and request body
        applicationContext = SpringApplication.run(Application.class, args);
    }

    @Bean
    WebMvcConfigurer webMvcConfigurer(){
        return new WebMvcConfigurer() {
            @Override
            public void addResourceHandlers(ResourceHandlerRegistry registry) {
                registry
                        .addResourceHandler("/**")
                        .addResourceLocations("classpath:/")
                        .setCacheControl(CacheControl.maxAge(3600, TimeUnit.SECONDS).noTransform().mustRevalidate());
            }
        };
    }
}

Мои свойства Coputational и Метод тестирования

public String test(){
        return hello();
    }


    @Cacheable("hello")
    public String hello(){
        System.out.println("hello");
        return "Hello";
    }

1 Ответ

0 голосов
/ 05 апреля 2020

Аннотация @Cacheable кэширует значения, когда он вызывается извне вашего @Bean, поэтому вызов его из другого метода внутри вашего компонента не будет работать.

попробуйте что-то вроде

@Bean 
public class CachingBean {
    @Cacheable("hello")
    public String hello(){
        System.out.println("hello");
        return "Hello";
    }
}

@Service
public class CallerService {

  @Autowired
  private CachingBean cachingBean;

  // Setters, constructors...

  public String test(){
        return cachingBean.hello();
  }
}

И тогда это должно работать. Это связано с тем, что аннотация @Cacheable создает прокси вокруг вызова метода, когда он внедряется как компонент, поэтому прямой вызов (экземпляру, созданному напрямую) или внутренний вызов не перехватывается, и механизм кэширования даже не видит эти вызовы.

Я до сих пор иногда забываю об этом и укушаюсь в начале :). Ура!

...