Spring中使用的动态代理主要有两种实现方式:JDK动态代理和CGLIB(Code Generation Library)动态代理。这两种代理方式有一些区别,适用于不同的情况。
java.lang.reflect.Proxy
类实现,使用Java的反射机制生成代理类。net.sf.cglib.proxy.Enhancer
类实现,使用字节码生成技术生成一个被代理类的子类。在Spring中,默认情况下,如果目标对象实现了至少一个接口,则使用JDK动态代理,否则使用CGLIB动态代理。可以通过配置来强制使用一种代理方式,或者通过使用@Primary
注解来指定首选的代理方式。例如:
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true) // 强制使用CGLIB代理
public class AppConfig {
// 配置内容
}
总体而言,JDK动态代理和CGLIB动态代理各有优劣,选择取决于具体的业务需求和对象结构。
Proudly powered by WordPress