使用Ehcache时发现个不起眼的小问题html
在一个Model中有如下代码:java
public class MyModel implements Serializable { private static final long serialVersionUID = -990334519496260591L; private IUserService us = ServiceManager.me.getUserService(); //getter and setter
}
在将这个Model的一个实例缓存到Ehcache时,若是刚好Ehcache配置了容许保存到磁盘,那么就会提示错误:缓存
ERROR DiskStorageFactory Disk Write of xxxxxxx failed:
java.io.NotSerializableException: com.my.service.impl.UserServiceImpl$$EnhancerByGuice$$80ede2b6ui
看错误提示,很明显是 UserServiceImpl 对象没法序列化,原来是Ehcache把这个服务逻辑也当作了Model的普通属性spa
正常状况下,将 UserServiceImpl 实现 Serializable 接口就能够解决问题code
但实际上,这个服务是无状态的单列模式,将它序列化到磁盘是没有任何意义的,还会增长磁盘的IO开销htm
那怎么样才能将Model成功缓存,又能刨除这些服务逻辑的属性呢?对象
这时候,一个不起眼的关键字发挥了做用:transientblog
将上面的代码改为以下,其实只是增长了这个关键字而已:接口
public class MyModel implements Serializable { private static final long serialVersionUID = -990334519496260591L; private transient IUserService us = ServiceManager.me.getUserService(); //getter and setter
}
再次缓存时,将不会提示错误。
这里有一篇文章对 transient 关键字进行了更详细的阐述:http://www.javashuo.com/article/p-mhffiycv-g.html