interfaceをConfigurationとして利用する(2) 静的な言語では実装クラス/メソッドは動的に生成して、実際の処理はInterceptorで外部に委譲
っというわけで、interfaceから実装クラス/メソッドは動的に生成して、実際の処理はInterceptorで外部に委譲する方法の、Sprint/CGLIBでのやりかた*1。
まずは登場人物について考えてみます(・∀・)
Springを利用する場合、次の人達が居れば、この仕組みを実現できるかな、っと。
- 対象interfaceをSpringのBeanFactoryに登録するコンポーネント(HogeRegister)
- 動的な実装クラスを生成するSpringのFactoryBean派生(HogeFactoryBean)
- メソッド呼び出しに割り込んで外部に処理を委譲するInterceptor(HogeInterceptor)
HogeRegisterは、BeanFactoryAware、BeanFactoryPostProcessorなコンポーネントとして作成し、Springに登録します。
っで、postProcessBeanFactory()処理内で対象となるinterfaceをスキャンし、BeanFactoryAwareで取得したBeanFactoryに登録していきます。
なお、登録するのは対象interfaceそのものではなくて、HogeFactoryBeanになります。
ちなみに、登録の際はパッケージの指定やアノテーションの有無により、登録する対象をフィルタリングします。
HogeFactoryBeanはFactoryBean派生として作成し、コンポーネントの要求に対して対象interfaceから動的に派生クラスを作成します。
また、作成するインスタンスにはHogeInterceptorを織り込みます。
この仕組みにより、対象interfaceをSpringから取得してメソッドを呼び出すと、HogeInterceptorのinvoke()が呼び出されるようになります(・∀・)
invoke()内では本来のMethodは呼び出さず、Methodのシグネチャ及び付加されたアノテーションからメタ情報を取得して、その情報を元に外部に処理を委譲するようにします。
なお、メタ情報と処理の移譲先の話は今回は対象外です。
っというわけで、次はこの実装例(・∀・)
*1:なんか長いんで、これのパターン名が欲しいところですね(´д`;)