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

时间:2016-04-05 11:00:57

标签: spring proxy aop spring-aop cglib

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

但是在我们将弹簧从3.0.6变为4.2.4后,事情变得奇怪了。 如果我们一起使用proxy和aop,它们都不能工作,它只是直接调用用户类的方法。(看起来很好用spring 3.0.6,不知道为什么)

我追踪到堆栈,发现CglibAopProxy生成的代理将包含以下字段:

  

CGLIB $ BOUND = false CGLIB $ CALLBACK_0 = DynamicAdvisedInterceptor @ 8186   CGLIB $ CALLBACK_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 个答案:

答案 0 :(得分:0)

以及...

我发现cglib和spring的cglib无法互相检测。因此,Enhancer.isEnhanced()失败了。因此,超级类成为了CGLIB的代理类。 因此,外部代理类被破坏了。

所以,我们检测到" $$"在班级名称中,如果有的话,我们会去它的超类,直到没有" $$"。然后,它工作(也许)。