代理模式()
以上代码中在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数据库开发优化指南