代码之家  ›  专栏  ›  技术社区  ›  Meilun Sheng

在由另一个增强程序或CglibAopProxy生成的代理上创建增强程序

  •  0
  • Meilun Sheng  · 技术社区  · 9 年前

    我们必须通过Cglib构建一些代理,有时代理的“超类”可以是由Cglib或CglibAopProxy生成的另一个代理。

    但当我们将弹簧从3.0.6改为4.2.4后,事情变得奇怪了。 如果我们同时使用代理和aop,它们都不能工作,它只会直接调用用户类的方法。(弹簧3.0.6看起来不错,不知道为什么)

    我跟踪到堆栈,发现CglibAopProxy生成的代理将具有以下字段:

    CGLIB$BOUND=false CGLIB=CALLBACK_0=DynamicAdvisedInterceptor@8186 CGLIB$回调1=StaticUnadvisedInterceptor@8535
    ...

    在我们使用这个代理的类作为Enhancer的超类之后,它看起来像:

     CGLIB$BOUND=true
     CGLIB$CALLBACK_0=InvokeHandler@8399 (the MethodInterceptor we added)
     CGLIB$CALLBACK_1=null
     ...
     CGLIB$CALLBACK_6=null
     ExampleController$$EnhancerBySpringCGLIB$$2ab2772f.CGLIB$BOUND=true
     ExampleController$$EnhancerBySpringCGLIB$$2ab2772f.CGLIB$CALLBACK_0=null
    

    在InvokerHandler内部有一个由CglibAopProxy生成的代理实例。我们将在InvokerHandler中调用它

    我们希望调用首先进入InvokeHandler,然后处理aop,然后调用用户类。但从这个问题开始,我们就再也无法继续了。

    1 回复  |  直到 9 年前
        1
  •  0
  •   Meilun Sheng    9 年前

    我发现cglib和spring的cglib无法相互检测。所以,增强器。isEnhanced()失败。因此,超级类成为了CGLIB的代理类。 因此,Outside Proxy类被破坏。

    因此,我们在类名中检测到“$$”,如果有,我们就转到它的超类,直到没有“$$“。然后,它会起作用(也许)。