アスペクトで注釈が付けられた私のSpringコントローラーでは、CGLibプロキシを削除し、それらをJDK動的プロキシに置き換えようとしています。JDK動的プロキシはインターフェースでのみ機能するため、クラスがインターフェースを実装しない場合、Spring AOPはCGLibを使用することを知っています。また、インターフェースと実装クラスの両方に注釈が存在する必要があることも認識しています。しかし、私が直面している問題は、コントローラーが JDK プロキシーを持つ Bean として表示されなくなったことです。
私のコントローラ Bean は次のようにスキャンされます。
<context:annotation-config/>
<context:component-scan base-package="com.package.name"/>
これは機能しますが、コントローラーは CGLibController$$EnhancerByCGLIB$$5f0b2287 として表示されます。
package com.package.name;
@Controller
public class CGLibController {
@AOP_Aspect
@RequestMapping("some_url")
public void foo();
}
//in a bean post processor
//in postProcessAfterInitialization(Object bean, String beanName)
Controller controller = AnnotationUtils
.findAnnotation(bean.getClass(), Controller.class);
//controller will exist
//bean name is CGLibController$$EnhancerByCGLIB$$5f0b2287
これは機能しません。Bean ポスト プロセッサに到達することはありません。
package com.package.name;
@Controller
public interface ITest{
@AOP_Aspect
@RequestMapping("some_url")
public void foo();
}
package com.package.name;
@Controller
public class DynamicController implements ITest{
@AOP_Aspect
@RequestMapping("some_url")
public void foo();
}
ただし、この DynamicController Bean を次のように明示的に作成すると、
<bean class="com.package.name.DynamicController"/>
次に、サーバーを起動すると、ServletContext が不平を言います
Bean の初期化に失敗しました。ネストされた例外は java.lang.IllegalStateException です: ハンドラー 'dynamicController' を URL パス [some_url] にマップできません: タイプ [クラス $Proxy61] のハンドラーが既にマップされています。
ここで何かが起こっています。DynamicController は動的プロキシです。しかし、他に何が起こっているのかはわかりません。もはや Bean/Controller ではないことはわかっています。「コントローラー、アスペクト、動的プロキシー: 任意の 2 つを選択」は必要ありません。3 つすべてが必要です。これはどういうわけか可能ですか?