- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的 ProductServiceImpl 类。
public class ProductServiceImpl implements ProductService {
@Autowired
GalaxyService gs ;
@PostConstruct
private void init() {
int hash = Objects.hash("Galaxy");
gs.updateByName(hash);
}
@Override
@Cacheable(value = "products", key = "T(java.util.Objects).hash(#p0)")
public String getByName(String name) {
System.out.println("Inside method");
slowLookupOperation();
return name + " : " + name;
}
@CacheEvict(value = "products", allEntries = true)
public void refreshAllProducts() {
//This method will remove all 'products' from cache, say as a result of flush API.
}
public void slowLookupOperation() {
try {
long time = 5000L;
Thread.sleep(time);
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
}}
这是我的 GalaxyServiceImpl:
public class GalaxyServiceImpl implements GalaxyService {
@Override
@CachePut(value = "products", key = "#key")
public String updateByName(Integer key) {
return "Oh My Galaxy- " + key;
}}
通过 ProductServiceImpl 的 init() 方法,我正在更新缓存元素。看起来 Spring 缓存没有缓存该方法。
但是,我是从我的主类中执行此操作的,它正在缓存该方法。主要类如下:
public mainconstructor() {
AbstractApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
ProductService service = (ProductService) context.getBean("productService");
GalaxyService gs = (GalaxyService) context.getBean("galaxy");
int hash = Objects.hash("Galaxy");
gs.updateByName(hash);
System.out.println("Galaxy S8 ->" + service.getByName("Galaxy"));
((AbstractApplicationContext) context).close();
}
我的应用程序配置类如下:
@EnableCaching
@Configuration
@ComponentScan(basePackages = {"com.websystique.spring", "com.samsung.gs8"})
public class AppConfig {
@Bean
public CacheManager cacheManager() {
return new EhCacheCacheManager(ehCacheCacheManager().getObject());
}
@Bean
public EhCacheManagerFactoryBean ehCacheCacheManager() {
EhCacheManagerFactoryBean factory = new EhCacheManagerFactoryBean();
factory.setConfigLocation(new ClassPathResource("ehcache.xml"));
factory.setShared(true);
factory.setAcceptExisting(false);
return factory;
}
@Bean
public GalaxyService galaxy() {
GalaxyService gs = new GalaxyServiceImpl();
return gs;
}}
完整代码可在- https://github.com/pijushcse/SpringCache获取
我的问题是,如果我想更新缓存项,ProductServiceImpl 出了什么问题?为什么它在 Main 类中有效,为什么在其他类中不起作用? TIA
最佳答案
简单的回答是:这是正常的。您不应在 @PostConstruct
中初始化缓存。
现在是长答案。 CacheInterceptor
很特殊。它是通过 initialized = false
创建的。然后,在一个特殊的回调SmartInitializingSingleton
中,它进入initialized = true
。所有 bean 初始化后都会调用此回调。在此之前,它不会缓存任何内容。
底线,您无法在 @PostConstruct
中预先缓存某些内容。
最好的解决方案是自己触发缓存。无论如何,它可能更干净,并且提供了更多的灵 active 。所以 getBean
是有道理的。
关于java - Spring @Cacheable、@CachePut 不适用于另一个代理类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48528284/
我正在尝试使用 Spring Cacheable,但遇到了类转换异常 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(cla
我就废话不多说了,大家还是直接看代码吧~ ? 1
我有这个实用方法来加载我的网络应用程序的内容 @Cacheable(value="dataStrore" ) public MarketJson retrieveMarketJson(DataRequ
与内存数据库一起使用@Cacheable是否相关? 我在内存数据库中使用 h2,只是想知道使用 @Cacheable 可以提高应用程序的性能。我的应用程序将频繁调用数据库中的静态数据 最佳答案 一般来
将 Spring 3.2 与 EhCache 2.9 一起使用。我已经注释了一个零参数方法如下: @Cacheable(value="myList", key="#result.method.name
我正在尝试将 Redis 与 Spring 的 @Cacheable 一起使用,但需要根据 Spring Boot 样式的应用程序属性有条件地打开或关闭缓存。我的第一次尝试似乎没有用。 applica
我在 Spring 3.2 中使用 @Cacheable 来缓存服务层方法的结果。服务类内部使用以下方法代码: @Cacheable("questions") public List getSecut
如何查看@Cacheable 的实现。我想了解他们如何能够获取方法参数的名称并在运行时获取其实际值。 例如: @Cacheable(cacheNames = "name", key = "#k
我正在努力在 Spring Boot 集成测试中测试 @Cacheable。这是我学习如何进行集成测试的第二天,我发现的所有示例都使用旧版本。我还看到了 assetEquals("some value
背景 项目中,使用@Cacheable进行数据缓存。发现:当redis宕机之后,@Cacheable注解的方法并未进行缓存冲突,而是直接抛出异常。而这样的异常会导致服务不可用。 原因分析 我们
我在 Spring 4.1.4 应用程序中使用最新的 Ehcache。我所拥有的是: class Contact{ int id; int revision; } @Cachea
我已经看到很多同一个问题的化身,但我想我已经尝试了所有修复 - 我的用法非常简单。 我一直在使用 Ehcache,但也没有用。因此,为了排除 Ehcache 问题并帮助指出更基本的东西,我转向了 Si
我有一个关于 Spring Security 和 Spring Caching 的问题。假设我有一个方法,并且我已经用 @PreAuthorize("condition") 和 @Cacheable(
我一般用@Cacheable在我的 spring-boot 应用程序中使用缓存配置并为每个缓存设置特定的 TTL(生存时间)。 我最近继承了一个使用 @Cacheable 的 spring boot
我想将一项服务设为可缓存。我一直在研究grails-cache plugin它看起来很有希望,但它导致了一些我不理解的行为。 考虑以下服务: class FooService { def co
我在使用多参数和分页的 @Cacheable 时遇到问题。 @Cacheable(value = "books", key = "#p0") public List findBooks(Long lo
当调用带有 @Cacheable 注释且同步标志设置为 true 的方法时,出现以下异常: java.lang.AbstractMethodError: org.springframework.cac
我已将我的应用程序升级到 Spring 3.1,并且所有 jar 都已充分更新。但是,当我尝试对其中一个 Controller 中的方法使用 @Cacheable 时,该 Controller 的所有
如何进行以下工作? public abstract class MyAbstractOne { @Cacheable(value="myCache") public MyObj
尝试使用内联刷新来实现我自己的缓存加载器。此缓存加载使用 RefreshAheadCacheFactory 如描述 http://terracotta.org/documentation/4.1/bi
我是一名优秀的程序员,十分优秀!