当动态代理遇到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生成的代理类详解

posted on 2022-06-17 11:43  silyvin  阅读(61)  评论(0)    收藏  举报