4.6 Resources as dependencies

Beanがリソースのパスを指定してリソースの取得を行う場合、おそらくResourceLoaderのインタフェースを使うだろう。ここで、あるテンプレートを読み込む例を考える。このテンプレートは、ユーザーのロールごとに異なるリソースが必要になるとしよう。もし静的なリソースであれば、ResourceLoaderを使用するのはやめ、リソースを属性として持つBeanを定義しインジェクションするのがいいだろう。

Resourceをインジェクションする場合に、全てのアプリケーションコンテキストにおいて、StringをResourceに変換する特別なPropertyEditorが登録されている。そのため、例えば以下のように書けば設定ファイルによるResourceのインジェクションを指定できる*1


<bean id="myBean" class="...">
<property name="template" value="some/resource/path/myTemplate.txt"/>
</bean>

ここで、上記の例はprefixがない。この場合はこのBeanをIoCに登録したApplicationContextの実装クラスによって、どのリソースとして読み込まれるかが決まる。リソースの種類を明示するためには当然prefixをつければ良い。


<property name="template" value="classpath:some/resource/path/myTemplate.txt">
<property name="template" value="file:/some/resource/path/myTemplate.txt"/>

*1:アノテーションベースの場合はまた別のアプローチかなと思う