1、动态代理和cgLib的代理区别
Jdk代理与目标类都会实现同一个接口,并且在代理类中会调用目标类中被代理的方法,调用者实际调用的则是代理类的方法,通过这种方式我们就可以在代理类中织入切面逻辑;
Jdk代理存在的问题在于目标类被代理的方法必须实现某个接口
Cglib代理则是为了解决这个问题而存在的,其实现代理的方式是通过为目标类动态生成一个子类,通过在子类中织入相应逻辑来达到织入代理逻辑的目的。
看下CgLib的demo:
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
class MyCgClazz{
private int age;
private String name;
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
System.out.println(" MyCgClazz 类执行这个年龄的方法 。。。。。。");
return age;
}
public String getName() {
return name;
}
}
public class CgProxy implements MethodInterceptor {
public static void main(String[] args) {
Enhancer enhancer =new Enhancer();
enhancer.setSuperclass(MyCgClazz.class);
enhancer.setCallback(new CgProxy());
MyCgClazz myCgClazz =(MyCgClazz)enhancer.create();
myCgClazz.getAge();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) {
try {
if (method.getName().equals("getAge")) {
System.out.println("cgLib 在调用方法前,启动监听");
}
Object object = methodProxy.invokeSuper(o,objects);
if (method.getName().equals("getAge")) {
System.out.println("cgLib 在调用方法之后,监听结束");
}
return object;
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return null;
}
}