使用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