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 注入时围绕方法调用创建代理,因此直接调用(对直接创建的实例)或内部调用不会被拦截,缓存机制甚至看不到这些调用。
我有时还是忘记了它,一开始就被它咬了:)。
干杯!
我想使用一种机制来创建一次性计算函数。我尝试使用 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 注入时围绕方法调用创建代理,因此直接调用(对直接创建的实例)或内部调用不会被拦截,缓存机制甚至看不到这些调用。
我有时还是忘记了它,一开始就被它咬了:)。 干杯!