代理模式()
以上代碼中在sessionload()方法後首先輸出了User的類名它的超類User實現的接口最後輸出調用User的getName()方法取得數據庫數據這段程序的輸出如下(本例中使用Hibernate 不同的Hibernate版本實現會有細節上的差異)
Class Name:$javatuningchproxyhibernateUser$$EnhancerByCGLIB$$
dbe
Super Class Name:javatuningchproxyhibernateUser
interface:orghibernateproxyHibernateProxy
Hibernate: select user_id as id__ user_name as name__ user_age as age__ from testuser user_ where user_id=?
Geym
仔細觀察這段輸出可以看到session的載入類並不是之前定義的User類而是名叫javatuningchproxyhibernateUser$$EnhancerByCGLIB$$dbed的類從名稱上可以推測它是使用CGLIB的Enhancer類生成的動態類該類的父類才是應用程序定義的User類
此外它實現了HibernateProxy接口由此可見Hibernate使用一個動態代理子類替代用戶定義的類這樣在載入對象時就不必初始化對象的所有信息通過代理攔截原有的getter方法可以在真正使用對象數據時才去數據庫加載實際的數據從而提升系統性能由這段輸出的順序來看也正是這樣在getName()被調用之前Hibernate從未輸出過一條SQL語句這表示User對象被加載時根本就沒有訪問數據庫而在getName()方法被調用時才真正完成了數據庫操作
注意Hibernate框架中對實體類的動態代理是代理模式用於延遲加載的經典實現有興趣的讀者可以深入研究Hibernate的內部實現
返回目錄Java程序性能優化讓你的Java程序更快更穩定
編輯推薦
Java程序設計培訓視頻教程
JEE高級框架實戰培訓視頻教程
JME移動開發實戰教學視頻
Visual C++音頻/視頻技術開發與實戰
Oracle索引技術
ORACLEG數據庫開發優化指南
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27828.html