当动态代理遇到ioc (六)代理类内存对象模型及ioc反哺模型
Jdk:
Interface Target & TargetImpl 待代理类
Class TargetImpl-jdkproxy : implements Target { 注入ioc容器
InvocationHandler h { 程序员传入
TargetImpl targetImpl 未注入
@Inject
XXXService xxxService; 因为未注入而未装配
invoke {
Method.invoke(targetImpl, …); null
}
}
}
Cglib:
Class Target {
@Inject
Private XXXService xxxService; 因为未注入而未装配,未被继承
}
Class SubTarget extends Target {
MethodInterceptor h { 程序员传入
Target target;
@Inject
XXXService xxxService; 因为未注入而未装配
intercept() {
methodProxy.invokeSuper(subtarget) 父类对象 null
method.invoke(target) 子类对象 null
}
}
}
在子类(代理类)还是父类(被代理类)上反哺?取决于怎么使用cglib代理(cglib两种方式)
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("开始事务cglib");
//执行目标对象的方法
// Object returnValue = method.invoke(target, args);
// 上面那个直接调用父类对象target的父方法,this指向父类——被代理origin类
// obj为子类——proxy类对象,this指向proxy对象
//在这个地方拦截子函数
Object returnValue = proxy.invokeSuper(obj, args);
// Object returnValue = method.invoke(obj, args); 无限循环
System.out.println("提交事务cglib");
return returnValue;
}
因此得到第一个结论:
本例中,要在子类对象反哺,反哺到子类对象父类成员,而不是反哺到父类对象
子类对象未继承父类private级的成员,但是子类对象内存空间里有一块是存放父类private成员的,用反射把那一块补上。
参考: https://blog.csdn.net/P19777/article/details/103998918 CGLIB入门系列三,CGLIB生成的代理类详解
浙公网安备 33010602011771号