为什么spring的默认jdk动态代理
时间: 2023-11-02 19:05:33 浏览: 115
Spring默认使用JDK动态代理来实现AOP,主要原因有两个:
1. JDK动态代理是Java自带的一种动态代理方式,不需要额外的依赖,使用起来比较方便。
2. JDK动态代理基于接口进行代理,可以为任何实现了接口的类生成代理对象。而CGLIB动态代理是基于继承进行代理,只能为没有final修饰的类生成代理对象,限制比较多。
另外,JDK动态代理在运行时动态生成代理类,相对于CGLIB动态代理在编译时生成代理类,更加灵活,可以避免一些潜在的问题。因此,Spring选择了JDK动态代理作为默认的AOP实现方式。
相关问题
Spring Aop中的JDK动态代理和CGLIB动态代理有什么区别
在 Spring AOP 中,JDK 动态代理和 CGLIB 动态代理都可以用来实现切面的功能,它们的主要区别在于:
1. JDK 动态代理只能代理实现了接口的类,而 CGLIB 动态代理可以代理没有实现接口的类。这是因为 JDK 动态代理是基于接口来实现的,而 CGLIB 动态代理则是通过生成被代理类的子类来实现的。
2. JDK 动态代理相对于 CGLIB 动态代理来说,生成代理对象的速度更快,执行效率也更高。这是因为 JDK 动态代理是使用 Java 自带的反射机制来实现的,而 CGLIB 动态代理则是使用 ASM 字节码操作框架来生成字节码的。
3. JDK 动态代理适用于对单个对象的代理,而 CGLIB 动态代理适用于对类的代理。这是因为 JDK 动态代理生成的代理对象是实现了接口的单个对象,而 CGLIB 动态代理生成的代理对象是被代理类的子类。
需要注意的是,当被代理的类没有实现接口时,Spring AOP 默认会使用 CGLIB 动态代理来生成代理对象,如果被代理的类实现了接口,则可以通过配置来选择使用 JDK 动态代理或 CGLIB 动态代理。
springaop默认的动态代理
Spring AOP 默认使用 JDK 动态代理来实现代理对象。JDK 动态代理是基于接口的代理,它通过生成实现目标接口的代理类来实现代理功能。在运行时,JDK 动态代理会动态生成一个代理类,并在代理类中通过反射调用被代理对象的方法。
要使用 JDK 动态代理,被代理的类必须实现一个接口,因为 JDK 动态代理是基于接口的代理。Spring AOP 使用 JDK 动态代理时,会自动为目标对象生成一个代理对象,该代理对象实现了目标对象所实现的接口,并在方法调用前后执行相应的切面逻辑。
当目标对象实现了多个接口时,Spring AOP 默认使用 JDK 动态代理。如果目标对象没有实现任何接口,则会使用 CGLIB 动态代理来创建代理对象。CGLIB 动态代理是基于继承的代理,它通过生成目标类的子类来实现代理功能。
阅读全文