Java 从依赖jar使用Spring CacheManager
我有几个WAR项目,其中包括对某个实用程序JAR项目的依赖关系。我希望能够使用spring的@Cacheable注释来缓存实用程序项目中的某些方法,因此我尝试在实用程序项目上创建一个配置文件,在该文件中我可以定义一个CacheManager bean来处理方法的缓存。配置文件如下所示: (注意,我使用的是Redis缓存实现,但是其他缓存提供程序的spring配置应该非常类似) 项目B是另一个WAR,它有自己的CacheManager(不与UTIL绑定),并使用@Cacheable缓存类似的方法。如果我点击项目A的methodA,则项目B中的缓存将正确存储,但项目A中的cachedMethod不会在缓存中存储任何内容(使用@Cacheable注释的utils项目中的方法也不会)。我也尝试了另一种方法,直接在项目A上创建CacheManager,但它也无法在utils项目内缓存带注释的方法(我更喜欢在utils项目上声明管理器,以便其他模块可以重用它) 我知道Spring正确地初始化了utils项目中的bean,因为如果项目A的上下文属性占位符没有从缓存配置文件中找到@Value注释的属性文件,那么项目A将无法运行。所以我假设cachemanagerbean在那里,但不知为什么它不起作用。关于我做错了什么,或者是否可以从依赖JAR使用CacheManager(如果可能,使用Java配置),有什么想法吗?我正在使用Spring3.2.0.RELEASEJava 从依赖jar使用Spring CacheManager,java,spring,caching,jar,redis,Java,Spring,Caching,Jar,Redis,我有几个WAR项目,其中包括对某个实用程序JAR项目的依赖关系。我希望能够使用spring的@Cacheable注释来缓存实用程序项目中的某些方法,因此我尝试在实用程序项目上创建一个配置文件,在该文件中我可以定义一个CacheManager bean来处理方法的缓存。配置文件如下所示: (注意,我使用的是Redis缓存实现,但是其他缓存提供程序的spring配置应该非常类似) 项目B是另一个WAR,它有自己的CacheManager(不与UTIL绑定),并使用@Cacheable缓存类似的方法。
几天来,我们一直在努力解决这个问题,因此非常感谢您的帮助。结果是spring cache抽象的默认代理模式存在问题。缓存注释不起作用的所有方法都被同一对象中的其他方法调用。我可以在CacheManager bean上使用@Autowire并手动执行缓存操作,正确地操作依赖jar项目中的缓存。虽然可以通过启用AspectJ编织模式来使用注释,但我不想因为必须处理依赖模块中的编织而增加复杂性。我遇到了类似的问题,将缓存方法移出同一对象正是需要的。感谢您的跟进,因为我完全忘记了spring代理行为,这使我免于任何进一步的挫折。是的,将@Cacheable方法移到调用方法类之外并进行自动连接是有效的。但这是一种好的方式吗?
@Configuration
@EnableCaching
public class RedisConfig {
@Value("${redis.hostUrl}")
private String hostUrl = null;
@Value("${redis.port}")
private Integer port = null;
@Value("${redis.defaultExpiration}")
private Integer defaultExpiration = null;
@Bean
public JedisConnectionFactory redisConnectionFactory() {
JedisConnectionFactory = new JedisConnectionFactory();
// Defaults
redisConnectionFactory.setHostName(hostUrl);
redisConnectionFactory.setPort(port);
return redisConnectionFactory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory cf) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(cf);
return redisTemplate;
}
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
// Number of seconds before expiration. Defaults to unlimited (0)
cacheManager.setDefaultExpiration(defaultExpiration);
cacheManager.setUsePrefix(true);
List<String> cacheNames = new ArrayList<String>();
cacheNames.add("testing");
cacheManager.setCacheNames(cacheNames);
return cacheManager;
}
}
@RequestMapping(...)
@ResponseBody
public Dto methodA(...) {
//The relevant part
testCachedMethod(value);
cachedMethodFromProjectB(value);
}
@Cacheable(value="testing")
public String testCachedMethod(String value) {
return value;
}