【问题标题】:Spring Cache not working as a compute propertySpring Cache 不能用作计算属性
【发布时间】:2020-04-05 08:26:51
【问题描述】:

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

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

我的计算属性和测试方法

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


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

【问题讨论】:

  • 究竟是什么不起作用?
  • 第一次调用 'hello' 方法时。我希望它的结果添加到缓存中。再次调用'hello'方法后,无法调用,使用缓存返回结果。但我的代码 hello 方法再次调用。我用 SOUT 测量它。第二次呼叫。
  • 我的英语不流利。对此我深表歉意。

标签: java spring spring-boot spring-cache


【解决方案1】:

@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 注入时围绕方法调用创建了一个代理,因此不会拦截直接调用(对直接创建的实例)或内部调用,并且缓存机制甚至看不到这些调用。

我有时还是会忘记它并在一开始就被它咬伤:)。 干杯!

【讨论】:

  • 感谢您的回答。方法名和缓存名应该相等?
  • 不,它们不需要相等。它是存储方法结果的“缓存”的名称。您可以在不同的方法中使用相同的缓存名称,以防您在不同的方法中生成结果,如果您需要更新/清除缓存,您可以引用这些方法。 (例如,您可以在baeldung.com/spring-cache-tutorial 中看到\@CacheEvict、\@CachePut 等如何工作)事实上,最好不要使用相同的名称。方法名称通常是动作/动词,对于缓存名称,名词听起来更合适。干杯
猜你喜欢
  • 2015-08-19
  • 2016-04-05
  • 1970-01-01
  • 2016-08-28
  • 2021-06-04
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多