spring中,通过cglib实现aop的动态代理时,method.invoke和method.invokeSuper有什么区别,使用上有什么不一样?
时间: 2024-04-20 19:27:00 浏览: 8
在使用 cglib 实现 AOP 动态代理时,method.invoke 和 method.invokeSuper 都是用来调用原始方法的,但是二者有一些不同之处。
具体来说,method.invoke 是直接调用原始方法,而 method.invokeSuper 则是调用被代理类的父类方法,也就是说,如果被代理对象是一个子类,则 method.invokeSuper 会调用父类中的方法,而 method.invoke 则只会调用子类中的方法。
在使用上,method.invoke 和 method.invokeSuper 的区别在于传入的参数不同。method.invoke 需要传入被代理对象和方法的参数,而 method.invokeSuper 则只需要传入被代理对象的实例和方法的参数。
需要注意的是,如果被代理对象是一个接口,则无法使用 cglib 实现动态代理,而只能使用 JDK 自带的动态代理。
相关问题
spring中,通过cglib实现aop的动态代理时,method.invoke和method.invokeSuper有什么区别
在Spring框架中,通过CGLIB实现AOP的动态代理时,method.invoke和method.invokeSuper主要有以下区别:
1. method.invoke:调用代理对象的方法,可以在方法执行前后加入增强逻辑。
2. method.invokeSuper:调用被代理对象的方法,不会触发代理对象的增强逻辑,只有被代理对象的增强逻辑会被执行。
在AOP中,代理对象的方法通常会被增强,而被代理对象的方法不会被增强。因此,在使用CGLIB实现AOP的动态代理时,通常会使用method.invoke方法来调用代理对象的方法,并在方法执行前后加入增强逻辑。而对于被代理对象的方法,可以使用method.invokeSuper方法来调用,以避免重复触发代理对象的增强逻辑。
需要注意的是,在使用method.invokeSuper方法时,必须将当前对象作为第一个参数传递给该方法,以便被代理对象在执行方法时能够正常访问其成员变量和方法。
spring中,aop通过cglib的实现方式和例子
在Spring中,如果要代理没有实现接口的类,可以使用cglib来实现动态代理。下面是cglib实现动态代理的方式和例子。
首先,引入cglib的依赖:
```xml
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
```
然后,定义一个需要被代理的类RealSubject,其中不需要实现任何接口:
```java
public class RealSubject {
public void request() {
System.out.println("RealSubject Request");
}
}
```
接下来,定义一个MethodInterceptor接口的实现类ProxyHandler,其中定义一个RealSubject类型的成员变量,用于指定代理的目标对象,然后在intercept方法中实现对目标对象方法的代理:
```java
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class ProxyHandler implements MethodInterceptor {
private RealSubject realSubject;
public ProxyHandler(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("ProxySubject before request");
Object result = method.invoke(realSubject, args);
System.out.println("ProxySubject after request");
return result;
}
}
```
在ProxyHandler类中,我们在intercept方法调用目标对象的方法前后分别输出一些字符串,以此实现对目标对象的代理。
最后,我们可以在客户端代码中创建RealSubject和cglib动态代理对象,并调用request方法:
```java
import net.sf.cglib.proxy.Enhancer;
public class Client {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ProxyHandler proxyHandler = new ProxyHandler(realSubject);
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(realSubject.getClass());
enhancer.setCallback(proxyHandler);
RealSubject proxySubject = (RealSubject) enhancer.create();
proxySubject.request();
}
}
```
在客户端代码中,我们创建了一个ProxyHandler对象,并将RealSubject对象传入,然后使用Enhancer类动态生成了一个代理对象proxySubject。最后调用proxySubject的request方法,实现了对RealSubject的代理。
输出结果为:
```
ProxySubject before request
RealSubject Request
ProxySubject after request
```
这就是cglib实现动态代理的方式和例子。需要注意的是,cglib动态代理的代理类是目标类的子类,因此如果目标类中有final方法,是无法代理的。