据我所知,创建一个动态 Java 代理需要一个接口来为代理工作。然而,Hibernate 似乎无需为实体类编写接口即可管理其动态代理生成。它是如何做到的?来自 Hibernate 文档的唯一线索是,类必须至少有一个包可见的构造函数才能生成代理。
Hibernate 是否使用自定义类加载器进行运行时字节码工程?文档表明情况并非如此。那么他们如何围绕具体实体对象创建代理包装器呢?他们是否只是创建一些琐碎接口的代理而不考虑类型安全,然后根据需要进行转换?
从 Hibernate 3.3 开始,默认的字节码提供程序现在是 Javassist 而不是 CGLib。
Hibernate 使用 中配置的字节码提供程序hibernate.properties
,例如:
hibernate.bytecode.provider=javassist
有关详细信息,请参阅类javassist.util.proxy.ProxyFactory。