Spring 缓存不能用作计算 属性

Spring Cache not working as a compute property

我想使用一种机制来创建一次性计算函数。我尝试使用 Spring 缓存。但它不起作用。请帮我解决这个问题。我的代码如下,

Gradle 依赖关系

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

Spring 引导应用程序的主要 Class

@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());
            }
        };
    }
}

我的计算属性和测试方法

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


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

@Cacheable 注释在从 @Bean 外部调用时缓存值,因此从 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 注解在作为 Bean 注入时围绕方法调用创建代理,因此直接调用(对直接创建的实例)或内部调用不会被拦截,缓存机制甚至看不到这些调用。

我有时还是忘记了它,一开始就被它咬了:)。 干杯!