matsukaz's blog

Agile, node.js, ruby, AWS, cocos2d-xなどなどいろいろやってます

アノテーション利用時のオブジェクト差し替え

Spring 2.5からはアノテーションを利用することで、XMLファイルを記述することなくオブジェクトのインジェクションが可能になりました。詳細はJSUGの勉強会で岡本さんが発表してくださった資料(Spring2.5-Annotation.pdf)をご参照ください。
アノテーションは確かに楽だけど、じゃあオブジェクトをモックと差し替えたい時にはアノテーションを変更してコンパイルし直さなきゃならないのか、という疑問が出てくるかと。結論から言えば、の記述を変更することでアノテーションを無効化し、オブジェクトの差し替えが可能です。今日はその方法を説明します。
アノテーションによるインジェクションを行う場合は、の記述をXMLに定義する必要があります。

<context:component-scan base-package="hoge.sample"/>

この記述により、hoge.sampleパッケージ配下の全てのクラスで定義されたアノテーションが読み込まれ、オブジェクトのインジェクションが行われます。
オブジェクトを差し替える場合は、の子要素にを定義します。

<context:component-scan base-package="hoge.sample">
    <context:exclude-filter type="assignable" expression="hoge.sample.FugaImpl"/>
</context:component-scan>

このような定義を行うと、hoge.sample.FugaImplクラスで定義されたアノテーションは無視されるため、別途bean定義を行うことでオブジェクトの差し替えが可能となります。
のtype属性には、以下のような指定が可能です。

Filter Type Example Expression
annotation org.example.SomeAnnotation
assignable org.example.SomeClass
regex org\.example\.Default.*
aspectj org.example..*Service+

これらを組み合わせれば、複数のクラスのアノテーションを効率よく有効化/無効化することができるかと。