Spring事务管理是动态代理还是静态代理? CGLB支持动态代理吗?因为我听老师说CGLB是静态代理
发布网友
发布时间:2022-03-24 06:11
我来回答
共1个回答
热心网友
时间:2022-03-24 07:40
JDK动态代理是运行时生成代理对象,其特点是有一个原对象实例,有一个代理对象实例,代理对象内部持有原对象的引用。
而CGLIB代理是运行时先编译一个新的类,直接在字节码的层级上把代码添加进原方法中,运行时只有一个动态生成的新类的实例,不存在源对象实例。
Spring同时支持这两种代理方式,但是因为JDK动态代理只能进行接口的代理,如果你要代理的对象没有实现接口,那就不能采取JDK动态代理,而会采用CGLIB代理。
一般情况下优先采用JDK动态代理,虽然其效率似乎比不上CGLIB代理,但是其对象用完之后可以正常释放。但是CGLIB代理每代理一个对象,都会产生一个新类。而类一旦载入JVM,按照大部分JVM的机制,这些新类占用的内存不会释放。J2EE程序一般运行时间都很长,内存上会有一些压力。