SpringのMethodInjection
Serverside.comの以下の記事より。
http://www.theserverside.com/news/thread.tss?thread_id=29499
Methodを使ってinjectionするのではなく、Methodそのものをinjectionすることなのですねー。
MethodInjectionのうちのArbitrary method replacementを使うと多重継承っぽいことができてしまう、というか全く関係のないクラスのメソッドをバリバリ呼び出せてしまいます。CGLIBの機能を使っているだけとはいっても設定一つであまりに気軽に出来てしまうのが..。(詳しい説明はSpringのリファレンスの3.3.3にあります)
さらに、MethodReplacerをimplementしてReflectionAPIを使って指定するbeanの指定するメソッドを呼び出すクラス(以下の例でのGenericReplacer)を1回作っておけば、もう普通のPOJOの好きなメソッドに置き換え放題です。
<beans> <bean id="basicRecorder" class="local.sample.BasicRecorder"> </bean> <bean id="recorder" class="local.sample.BasicRecorder"> <replaced-method name="record" replacer="recordDevice"/> </bean> <bean id="recordDevice" class="local.sample.GenericReplacer"> <property name="dest"><ref local="hddRecorder"/></property> <property name="methodName"><value>save</value></property> </bean> <bean id="hddRecorder" class="local.sample.HddRecorder"/> </beans>
...こんなの通常は使用禁止だと思うんですが。許容されるのはテスト時とかテスト用フレームワークくらいかなー。
保守フェーズで、クラスの中の1メソッドだけ中身を変更したいけどソースファイルが行方不明とかいう緊急事態でも、、やっぱりこの手法は使いたくないなぁ。