spring aop用的什么动态代理
-
Spring AOP使用的是JDK动态代理和CGLIB动态代理两种方式。
-
JDK动态代理:JDK动态代理是通过反射机制来实现代理的。当目标类实现了接口时,Spring AOP会使用JDK动态代理来生成代理类。JDK动态代理要求目标类实现接口,它通过在运行时创建一个实现了目标接口的匿名代理类的实例,并将对代理类方法的调用转发给目标类的方法。
-
CGLIB动态代理:CGLIB动态代理是通过继承的方式来实现代理的。当目标类没有实现接口时,Spring AOP会使用CGLIB动态代理来生成代理类。CGLIB(Code Generation Library)是一个强大的,高性能的代码生成库,它可以在运行时动态生成指定类的子类,增加了目标类的织入逻辑,实现代理功能。
Spring AOP会根据目标类是否实现了接口来选择使用JDK动态代理还是CGLIB动态代理。当目标类实现了接口时,Spring AOP会使用JDK动态代理;当目标类没有实现接口时,Spring AOP会使用CGLIB动态代理。
总结:Spring AOP使用JDK动态代理和CGLIB动态代理两种方式来实现代理功能。JDK动态代理要求目标类实现接口,通过反射机制来实现代理;CGLIB动态代理则通过继承的方式来实现代理,适用于目标类没有实现接口的情况。根据目标类是否实现了接口来选择使用不同的动态代理方式。
1年前 -
-
Spring AOP 使用的是 Java 的动态代理。具体来说,它使用了 JDK 的动态代理和 CGLIB 动态代理两种方式。
-
JDK 动态代理:JDK 提供了一个 java.lang.reflect 包,其中的 Proxy 类可以用于创建动态代理对象。JDK 动态代理要求目标对象实现至少一个接口,并通过代理类实现这个接口。在 Spring AOP 中,如果目标对象实现了接口,那么 Spring 就会使用 JDK 动态代理来生成代理对象。
-
CGLIB 动态代理:CGLIB(Code Generation Library)是一个第三方开源库,可以在运行时生成字节码,动态生成子类作为目标对象的代理。CGLIB 动态代理不需要目标对象实现接口,利用字节码技术生成代理类,并继承目标对象的实例,从而实现对目标对象的代理。如果目标对象没有实现接口,Spring AOP 就会使用 CGLIB 动态代理。
-
JDK 动态代理与 CGLIB 动态代理的选择:Spring AOP 在选择使用 JDK 动态代理还是 CGLIB 动态代理时,会根据以下几个条件来决定:
- 当目标对象实现了接口时,使用 JDK 动态代理。
- 当目标对象没有实现接口时,使用 CGLIB 动态代理。
- 可以通过配置文件或注解来指定使用 JDK 动态代理还是 CGLIB 动态代理。
-
JDK 动态代理的优缺点:JDK 动态代理是 Java 原生支持的代理方式,因此更加稳定和可靠。它的优点是性能相对较高,生成的代理类比 CGLIB 更加节省内存。但它的缺点是只能对实现了接口的类进行代理,而无法对普通类进行代理。
-
CGLIB 动态代理的优缺点:CGLIB 动态代理是通过生成目标对象的子类来实现代理,因此相对 JDK 动态代理而言,它更加强大,可以对任意类进行代理,包括没有实现接口的类。但它的缺点是生成的代理类相对较大,占用更多的内存,并且在生成代理对象时需要额外的时间。
1年前 -
-
Spring AOP使用的是动态代理。动态代理是一种在运行时创建代理对象的方式,可以实现对目标对象的方法进行拦截和增强。
在Spring AOP中,一般使用以下两种方式来实现动态代理:
-
JDK动态代理:JDK动态代理是通过实现接口来实现动态代理的。在Spring AOP中,如果目标对象实现了接口,则默认使用JDK动态代理。JDK动态代理主要是通过
java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现,它可以在运行时创建一个实现了目标对象接口的代理对象,然后通过该代理对象来执行方法。JDK动态代理的原理是通过创建一个代理类,该代理类实现了目标对象接口,并且在方法执行前后加入了拦截逻辑。 -
CGLib动态代理:CGLib动态代理是通过生成子类的方式来实现动态代理的。在Spring AOP中,如果目标对象没有实现接口,则会使用CGLib动态代理。CGLib的核心类是
net.sf.cglib.proxy.Enhancer,它通过继承目标对象的子类来创建代理对象,并在子类中重写目标对象的非final方法,实现方法的拦截和增强。CGLib动态代理相比于JDK动态代理,可以对没有实现接口的目标对象进行代理,但是由于采用继承的方式创建代理对象,所以无法代理final类和final方法。
总结起来,Spring AOP使用的是动态代理来实现对目标对象方法的拦截和增强。根据目标对象是否实现接口的情况,可以选择使用JDK动态代理或CGLib动态代理来创建代理对象。
1年前 -