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:なんか長いんで、これのパターン名が欲しいところですね(´д`;)