4.2 The Resource interface

4.2 The Resource interface

そこでSpringでは、java.net.URLよりもリソースを表現するよりよい抽象概念(abstraction)として、Resourceインタフェースを提供する。


public interface Resource extends InputStreamSource {
 //リソースが存在するかをチェックする。
boolean exists();
//対象のリソースのハンドルがオープンになっているかを返す。オープンされている場合はInputStreamを読み込めない。
boolean isOpen();
URL getURL() throws IOException;
File getFile() throws IOException;
Resource createRelative(String relativePath) throws IOException;
String getFilename();
String getDescription();
}

public interface InputStreamSource {
//リソースを探しInputStreamとしてオープンする。呼出都度fleshなStreamを毎回返却する。
//InputStreamの開放はアプリケーション側で行う。
InputStream getInputStream() throws IOException;
}

Resourceの主要なメソッドについては、上のサンプル上にコメントを付与しておきました。

ResourceはSpringのあちこちで使用されており、リソースが必要な場合はメソッドのシグニチャに引数として渡すようになっている。またApplicationContextのように文字列でリソースの場所を指定するシグニチャになっていることもある。この場合クラスが文字列をもとにApplicationContextのサブクラスが適切なリソースを生成することもあるし、また呼び出し側にどのリソースの実装を用いるかを「classpath:some/resource/path/myTemplate.txt」のようにprefixで指定することもある。

なおSpringの他の機能を使わなくても、Resourceだけをユーティリティとして利用することは可能。Springへの依存が発生する箇所も局所的にできるので、そんなに問題ないと考える。なおResourceゼロから作っているわけではなく既存のJavaAPIを利用している。例えばUrlResourceは単にURLをラップしているだけで、実際の処理はURLに委譲している。