据我所知,创建动态Java代理需要有一个接口来处理代理。然而,Hibernate似乎在不需要为实体类编写接口的情况下管理其动态代理生成。它是如何做到的? Hibernate文档中唯一的线索是指类必须至少具有用于代理生成的包可见构造函数。
Hibernate是否使用自定义类加载器进行运行时字节码工程?文档表明情况并非如此。那么他们如何围绕具体的实体对象创建代理包装器呢?他们只是创建了一些简单的接口代理而不用担心类型安全,然后根据需要进行转换吗?
答案 0 :(得分:8)
从Hibernate 3.3开始,默认的字节码提供程序现在是Javassist而不是CGLib。
答案 1 :(得分:4)
Hibernate使用hibernate.properties
中配置的字节码提供程序,例如:
hibernate.bytecode.provider=javassist
答案 2 :(得分:3)
要使用java中的代理创建者,是的,你是对的,但我相信hibernate使用CGLib来生成代理。
它是一个很酷的程序,不需要接口来生成代理。
(也许有一天hibernate将转向使用AOP,世界将会变得更好)。
答案 3 :(得分:3)
有关详细信息,请参阅课程javassist.util.proxy.ProxyFactory。