我们必须通过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,然后调用用户类。但是,由于这个问题,我们永远无法继续。
答案 0 :(得分:0)
以及...
我发现cglib和spring的cglib无法互相检测。因此,Enhancer.isEnhanced()失败了。因此,超级类成为了CGLIB的代理类。 因此,外部代理类被破坏了。
所以,我们检测到" $$"在班级名称中,如果有的话,我们会去它的超类,直到没有" $$"。然后,它工作(也许)。