2016-04-05 9 views
0

Cglib経由でプロキシを構築する必要があります。プロキシの「スーパークラス」がCglibまたはCglibAopProxyによって生成される別のプロキシになることがあります。別のエンハンサーまたはCglibAopProxyによって生成されたプロキシでエンハンサーを作成する

しかし、春を3.0.6から4.2.4に変更した後は、状況が変わってしまいます。 私たちがproxyとaopを一緒に使用すると、どちらもうまくいきません。ユーザークラスのメソッドを直接呼び出すだけです(春3.0.6でうまく見えます、理由はわかりません)

私はトレースをトレースしました

CGLIB $が拘束= falseをCGLIB $ CALLBACK_0 = DynamicAdvisedInterceptor @ 8186 CGLIB $ CALLBACK_1 = StaticUnadvisedInterceptor @ 8535
...

:、などのフィールドを持つことになりますCglibAopProxyによって生成されたそのプロキシを見つけました私たちがthiを使った後エンハンサーのスーパークラスとしてのプロキシのクラス、それは次のようになります。InvokerHandlerの内部

CGLIB$BOUND=true 
[email protected] (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 

CglibAopProxyによって生成されたプロキシのインスタンスがあります。 InvokerHandlerで呼び出します

呼び出しがInvokeHandlerに入ってから、まずaopを処理してから、ユーザークラスを呼び出してください。しかし、私たちはこの問題以来、決して続けることはできません。

答えて

0

も...

私はCGLIBと春のCGLIBが互いを検出できないことがわかりました。 Enhancer.isEnhanced()が失敗しました。したがって、スーパークラスはCGLIBのプロキシクラスになりました。 したがって、外部プロキシクラスが壊れています。

したがって、クラス名で "$$"を検出し、存在する場合は "$$"がなくなるまでスーパークラスになります。それで、それは(おそらく)動作します。

関連する問題