spring aop用什么代理
-
Spring AOP使用的是JDK动态代理和CGLIB代理两种方式。默认情况下,Spring AOP使用JDK动态代理来生成代理对象,只能代理实现了接口的类。如果目标对象没有实现任何接口,Spring AOP会自动使用CGLIB代理来生成代理对象。
JDK动态代理是通过反射机制来实现的,它要求目标对象实现一个或多个接口。当调用代理对象的方法时,实际上是通过反射机制调用目标对象的方法。
CGLIB代理是通过继承目标类来实现的,它不要求目标对象实现任何接口。当调用代理对象的方法时,实际上是调用了生成的子类的方法。
在Spring AOP中,通过在配置文件或使用注解的方式来声明切面和通知,然后通过AOP代理来实现对被代理对象的拦截和增强。
总结来说,Spring AOP使用JDK动态代理和CGLIB代理两种方式来生成代理对象,根据目标对象是否实现接口来选择适合的代理方式。
1年前 -
在Spring AOP中,主要使用了两种类型的代理:JDK动态代理和CGLib代理。
-
JDK动态代理:
JDK动态代理是基于Java反射机制实现的代理,它使用Proxy类和InvocationHandler接口来创建代理对象。JDK动态代理只能代理接口类型的对象,无法代理类类型的对象。当目标对象实现了接口时,Spring AOP使用JDK动态代理来创建代理对象。 -
CGLib代理:
CGLib代理是使用CGLib库动态生成字节码来创建代理对象。CGLib代理不需要目标对象必须实现接口,可以代理类类型的对象。当目标对象没有实现接口时,Spring AOP将使用CGLib代理来创建代理对象。 -
选择代理方式:
在Spring AOP中,选择使用JDK动态代理还是CGLib代理取决于目标对象是否实现了接口。如果目标对象实现了接口,则使用JDK动态代理;如果目标对象没有实现接口,则使用CGLib代理。 -
如何选择代理方式:
Spring AOP默认使用JDK动态代理,只有在目标对象没有实现接口的情况下才会使用CGLib代理。如果希望强制使用CGLib代理,可以通过配置文件进行设置。可以通过在配置文件中添加<aop:aspectj-autoproxy proxy-target-class="true"/>来强制使用CGLib代理。 -
代理性能比较:
JDK动态代理是通过Java的反射机制在运行时动态生成代理对象,因此在性能上略低于CGLib代理。CGLib代理是通过生成字节码来创建代理对象,性能较好。但是,CGLib代理需要依赖第三方库,增加了项目的依赖。所以在选择代理方式时,需要根据具体的业务需求和性能要求进行选择。
1年前 -
-
Spring AOP使用两种类型的代理:静态代理和动态代理。
-
静态代理:
静态代理是在编译时期就已经确定的代理类,在代码中显式地定义代理类。使用静态代理,需要手动编写代理类,其中包含对目标对象的引用,并实现与目标对象相同的接口。在代理类中,可以调用目标对象的方法前后执行自定义逻辑。静态代理在一些简单的场景下使用比较方便,但是对于大规模的系统和复杂的业务逻辑,代码量将会增加,且静态代理无法扩展到多个目标对象。 -
动态代理:
动态代理是在运行时期通过反射机制动态创建代理对象,不需要手动编写代理类。Spring AOP中使用的动态代理机制主要有两种方式:
-
JDK动态代理:JDK动态代理是通过接口实现的代理方式。Spring AOP中,如果目标对象实现了接口,则默认采用JDK动态代理来创建代理对象。JDK动态代理使用Java的反射机制,在运行时期通过Proxy类和InvocationHandler接口动态创建代理对象,并拦截对目标对象方法的调用。可以在代理对象的方法执行前后添加自定义逻辑。
-
CGLIB动态代理:CGLIB动态代理是通过继承实现的代理方式。当目标对象没有实现接口时,Spring AOP会使用CGLIB动态代理创建代理对象。CGLIB动态代理使用字节码生成技术,在运行时期通过继承目标对象的子类来创建代理对象,并覆盖其中的方法以拦截对目标对象方法的调用。与JDK动态代理不同,CGLIB动态代理可以代理没有实现接口的类。
总结:
Spring AOP使用静态代理和动态代理两种方式来实现代理。静态代理需要手动编写代理类,而动态代理在运行时期通过反射机制动态创建代理对象。JDK动态代理适用于接口代理,CGLIB动态代理适用于类代理。1年前 -