spring是怎么创建出代理对象的
-
Spring创建代理对象的方式有两种:基于接口的动态代理和基于类的CGLIB代理。
基于接口的动态代理是指在运行时动态生成一个实现了给定接口的代理类,该代理类会重写接口中的方法并添加额外的逻辑。Spring使用JDK的动态代理机制来实现基于接口的动态代理。当我们将一个接口注入到Bean中,并且在配置文件中将该Bean声明为代理时,Spring会在运行时动态生成一个代理类,并将该代理类的实例注入到Bean中。当调用代理对象的方法时,实际上是调用了代理类中重写的方法,代理类中的方法会先执行额外的逻辑,然后再调用目标对象的方法。
基于类的CGLIB代理是指在运行时动态生成一个目标类的子类,该子类继承了目标类并重写了其中的方法,并添加了额外的逻辑。Spring使用CGLIB库来实现基于类的CGLIB代理。当我们将一个普通的类注入到Bean中,并且在配置文件中将该Bean声明为代理时,Spring会在运行时动态生成一个目标类的子类,并将该子类的实例注入到Bean中。当调用代理对象的方法时,实际上是调用了子类中重写的方法,子类中的方法会先执行额外的逻辑,然后再调用父类(即目标类)的方法。
总结:Spring通过使用JDK的动态代理和CGLIB库,在运行时动态地创建了代理对象。基于接口的动态代理是通过生成实现接口的代理类来实现的,而基于类的CGLIB代理是通过生成目标类的子类来实现的。通过代理对象,我们可以在调用目标对象的方法之前和之后添加额外的逻辑,从而实现对目标对象的控制和增强。
1年前 -
-
首先,Spring创建代理对象的方式是通过动态代理实现的。动态代理是一种在运行时生成代理对象的机制,而不需要手动编写代理类的代码。
-
Spring创建代理对象的方式有两种:JDK动态代理和CGLIB动态代理。JDK动态代理是基于接口的代理,而CGLIB动态代理是基于类的代理。
-
对于使用接口的类,Spring使用JDK动态代理生成代理对象。JDK动态代理需要目标对象实现一个接口,然后通过代理工厂依靠Java的反射机制,在运行时动态创建代理对象。代理对象实现了目标接口,并可以拦截目标方法,执行一些额外的逻辑。
-
当目标对象没有实现接口时,Spring会使用CGLIB动态代理生成代理对象。CGLIB动态代理通过创建目标对象的子类来实现代理。通过继承的方式,代理对象可以拦截目标对象的方法,并在调用前后执行一些额外逻辑。
-
创建代理对象的过程中,Spring会利用AOP(面向切面编程)来为代理对象增加横切逻辑,如事务管理、日志记录等。通过配置切点和通知,可以灵活地为不同的方法添加不同的横切逻辑,而不需要修改目标类的源代码。
总结:
Spring在创建代理对象时,通过使用JDK动态代理或CGLIB动态代理的方式,在运行时动态生成代理对象。对于基于接口的类,使用JDK动态代理,而对于没有实现接口的类,使用CGLIB动态代理。通过AOP技术,可以为代理对象增加横切逻辑。这样,可以在不修改目标类源代码的情况下,为方法添加事务管理、日志记录等功能。
1年前 -
-
Spring创建代理对象的方式有两种:JDK动态代理和CGLIB代理。具体的实现方式如下:
JDK动态代理:
JDK动态代理是基于接口的代理,它使用Java的反射机制在运行时创建代理类。使用JDK动态代理,被代理对象必须实现一个接口。Spring会使用JDK的Proxy类来创建代理对象,该类可以在运行时动态生成代理类和代理对象。操作流程如下:
- 创建一个实现InvocationHandler接口的类,该类实现invoke方法,在invoke方法中实现代理逻辑。
- 在业务类中,使用Proxy.newProxyInstance()方法创建代理对象。该方法需要三个参数:类加载器,代理实现的接口数组,以及InvocationHandler实例。
- 当调用代理对象的方法时,代理对象会将方法调用委托给InvocationHandler的invoke方法。
- 在invoke方法中,可以在真正的业务方法执行前后添加额外的逻辑。
CGLIB代理:
CGLIB代理是基于继承的代理,它通过生成目标类的子类来创建代理对象。使用CGLIB代理,被代理对象不需要实现接口,代理类是目标类的子类。操作流程如下:
- 创建一个类,该类继承自CglibMethodInterceptor,并重写intercept方法。
- 在业务类中,创建Enhancer对象,并设置父类和回调。
- 使用Enhancer.create()方法创建代理对象。
- 当调用代理对象的方法时,代理对象会通过方法拦截器(intercept)处理方法调用,并在真正的业务方法执行前后添加额外的逻辑。
总结:
Spring在创建代理对象时,会根据被代理对象是否实现接口来选择使用JDK动态代理还是CGLIB代理。对于实现了接口的类,Spring会使用JDK动态代理;对于没有实现接口的类,Spring会使用CGLIB代理。无论使用哪种代理方式,Spring都会通过动态生成代理类来实现代理对象,并在代理对象中添加额外的逻辑。这种代理机制为AOP(面向切面编程)提供了基础,可以在方法调用前后添加事务管理、日志记录等通用的横切关注点。1年前