spring用的是什么动态代理
-
Spring使用的是JDK动态代理和CGLIB动态代理两种方式。
-
JDK动态代理:JDK动态代理是基于接口的代理实现,通过Java原生的java.lang.reflect包中的Proxy和InvocationHandler实现。JDK动态代理要求被代理对象实现至少一个接口。在运行时,JDK动态代理可以在不修改原始类的情况下,实现对目标类的方法进行拦截和增强,可以实现一些横切关注点的功能,比如日志记录、事务管理等。其缺点是只能代理实现了接口的类,无法代理没有实现接口的类。
-
CGLIB动态代理:CGLIB(Code Generation Library)动态代理是通过继承目标类,动态生成一个子类来实现的。CGLIB动态代理不要求目标类实现接口,可以代理任何类。CGLIB动态代理使用字节码处理框架ASM来转换目标类的字节码,生成子类并重写了被代理方法,添加了相应拦截逻辑。CGLIB动态代理的性能比JDK动态代理更高,但生成的代理类会比较大,影响初始加载和执行速度。
在Spring中,默认情况下,如果被代理对象实现了至少一个接口,Spring会使用JDK动态代理;如果没有实现接口,或者明确指定使用CGLIB动态代理,Spring会使用CGLIB动态代理。可以通过配置选项进行切换动态代理方式。此外,Spring AOP也支持使用AspectJ来实现代理。
1年前 -
-
Spring使用的是基于Java反射机制的JDK动态代理。
-
动态代理是一种在运行时创建代理对象的方法。它允许在不修改原始类的情况下,为其添加额外的逻辑。
-
JDK动态代理是由Java语言提供的一种动态代理机制,它基于接口实现。通过反射机制动态生成代理类和代理对象,实现对被代理对象的方法调用的拦截和增强。
-
在Spring中,动态代理主要用于实现AOP(面向切面编程)。通过在运行时生成代理类,Spring可以在原始类的方法调用前、后或中间插入额外的逻辑,如日志记录、性能监控、权限控制等。
-
JDK动态代理主要通过Proxy类和InvocationHandler接口来实现。Proxy类提供了创建代理对象的方法,而InvocationHandler接口允许在代理对象的方法调用前后执行额外的逻辑。
-
JDK动态代理有一个限制,即只能代理实现了接口的类。对于没有实现接口的类,可以使用其他的动态代理技术,如CGLIB(Code Generation Library)动态代理。CGLIB动态代理通过继承的方式来创建代理对象,并覆盖原始类的方法,实现对方法调用的拦截和增强。在Spring中,如果需要代理的对象没有实现接口,Spring会自动切换到使用CGLIB动态代理。
1年前 -
-
Spring框架默认使用的是基于接口的JDK动态代理。在使用AOP时,Spring会基于JDK动态代理或CGLIB动态代理来生成代理对象。
-
JDK动态代理:
JDK动态代理是Java提供的一种动态代理实现方式,它要求目标类必须实现至少一个接口。Spring通过Java的反射机制,在运行时动态地创建一个实现了目标类接口的代理类,代理类持有目标类的引用。在调用代理类的方法时,会委托给目标类的同名方法执行前后增强逻辑。JDK动态代理是Spring AOP的首选代理方式。 -
CGLIB动态代理:
CGLIB动态代理是基于字节码生成技术的动态代理实现方式,它能够在运行时动态地生成一个继承了目标类的子类作为代理类。对于没有实现任何接口的目标类,Spring会选择CGLIB动态代理生成代理对象。CGLIB动态代理通过继承的方式进行代理,因此可以实现对目标类所有非final方法的代理。
Spring在选择动态代理方式时会根据目标类是否实现接口来进行判断,如果实现了接口,则选择JDK动态代理;如果没有实现接口,则选择CGLIB动态代理。但也可以通过配置来强制使用某种代理方式。
在配置文件中使用aop:config来定义切面,并通过aop:advisor或aop:aspect来指定切入点、增强类型和增强逻辑。Spring会根据配置信息自动为目标类生成代理对象,并在方法调用前后执行相应的增强逻辑。
总结:Spring框架默认使用的是基于接口的JDK动态代理,并在必要时使用CGLIB动态代理来实现AOP的功能。
1年前 -