我有一个使用Grails Redis插件的应用程序。这个插件工作正常,并且在我的Grails工件中提供了一个redisService。我也有一个单例CacheManager
类,它具有一个静态实例变量,对redisSevice
的引用。在Boostrap.groovy
:Grails BootStrap问题
class BootStrap {
def redisService
def init = { servletContext ->
CacheManager.instance.redisService = redisService
}
def destroy = {
}
}
class CacheManager {
def redisService
private static CacheManager manager = new CacheManager()
private CacheManager() {
}
public static CacheManager getInstance() {
manager
}
}
这一段时间工作正常,一段时间后,该redisService
莫名其妙地变成空。我使用此缓存管理器作为redis上方的图层。我还没有找到更好的方法来将服务注入标准的POGO,所以这是有效的。它似乎在空闲了一段时间后失败了。
任何人都有一个想法,为什么?或者更好的主意?
你真的不应该使用'持有人'。通常当你发现自己到达“持有人”时,你需要暂停并问自己:“我真的在那里做正确的事情吗?”在你的情况下,答案是否定的。它应该是一个spring管理bean,你不应该使用'Holders'。 – 2014-11-15 10:05:08
我不认为这是使用Holders的最好主意,而是最小的修改来提供示例工作。通常情况下,我宁愿将'CacheManager'定义为bean,正如你在答案中所建议的那样。无论如何,感谢您的良好解释和建议:) – 2014-11-15 10:09:46
你更欢迎。乐意效劳。将提供的示例移动到'Resources.groovy'中的Spring托管bean实际上会减少代码的数量(例如,从bootstrap中删除的所有内容以及添加到资源中的一行或两行)。 :) – 2014-11-15 10:11:48