spring資源アクセスResource


jdkのアプリでは、リソースアクセスは基本的にURL類とIOで行われます.まずはjdkのリソースアクセスを紹介します.
  j 2 seにおいて、私たちは通常、Class Loaderのget Resource()方法によってリソースを検索する:
 
	public static void main(String[] args) throws IOException, URISyntaxException {
		URL url = Thread.currentThread().getContextClassLoader().getResource("format.properties");
		Properties p = new Properties();
		p.load(url.openStream());
		System.out.println(p.get("chengan"));
		System.out.println(url.getProtocol());
	}
   Class Loaderのget Resource()方法は資源にアクセスすることに制限があり、資源の位置はclassipathパスまたはclassipathのサブパスでのみ可能です.format.propertiesファイルのパスがclaspathパスでないと、gets Resource()方法はファイルが見つからないです.たとえば、ウェブプロジェクトを再開発する時、jdbc.propertiesは一般的にWEB-INFの下に新しいファイルを保存しています.ここではClass Loaderを使って取得できません.以下はservlet Contextを使って提供する方法が必要です.getsResource()メソッドパラメータはformat.propertiesを経路として使用できます.方法パラメータの開始経路はクラスパスです.
URL url = Thread.currentThread().getContextClassLoader().getResource("test/format.properties");
  
  J 2 eeでは、Servlet Contectが提供する方法getResource()を使用してリソースにアクセスすることができます.
		response.setContentType("text/html");
		URL url = request.getSession().getServletContext().getResource("/WEB-INF/config/jdbc.properties");
		response.getWriter().print(url);
  jdbc.propertiesファイルはWEB-INFのconfigファイルの下に置かれています.servlet ConteetのgetsResource方法はWebRootを起点としています.上のコードの運行の結果は以下の通りです.
  jndi:/local host/SpringDemo/WEB-INF/config/jdbc.properties
 
springの資源アクセスは統一インターフェースを提供しています.
springは設計の上で策略のモードを使って、異なった資源に対して訪問して、異なっている実現種類を提供して、常用する実現類はあります:
UrlResource:java.net.URLにアクセスするパッケージ
ServletContect Resource:servlet Contectアクセスリソースのパッケージ
FileSystem Resource:ファイルシステムのリソースのパッケージにアクセスします.
InputStream Resource:フロー操作リソースアクセス
Conttext Resource:このインターフェースは容器資源にアクセスするインターフェースであり、一連のインターフェースを実現するクラスを提供しています.
 
springでは、アクセスリソースの入り口は、aplicationContectの中で、aplication ContectはResource PatternResoliverインターフェースを継承しました.
public interface ResourcePatternResolver extends ResourceLoader {

	String CLASSPATH_ALL_URL_PREFIX = "classpath*:";

	Resource[] getResources(String locationPattern) throws IOException;

}
 Resource Pattern ResoloverはResource Loaderインターフェースを継承しました.
public interface ResourceLoader {

	/** Pseudo URL prefix for loading from the class path: "classpath:" */
	String CLASSPATH_URL_PREFIX = ResourceUtils.CLASSPATH_URL_PREFIX;


	Resource getResource(String location);

	ClassLoader getClassLoader();

}
 
リソースにアクセスするときは、リソースにアクセスする方法を指定できます.
	public Resource getResource(String location) {
		Assert.notNull(location, "Location must not be null");
                //  CLASSPATH_URL_PREFIX  :classpath:
		if (location.startsWith(CLASSPATH_URL_PREFIX)) {
			return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader());
		}
		else {
			try {
				// Try to parse the location as a URL...
				URL url = new URL(location);
				return new UrlResource(url);
			}
			catch (MalformedURLException ex) {
				// No URL -> resolve as resource path.
				return getResourceByPath(location);
			}
		}
	}
 上はResource Loaderの方法get Resource()のデフォルト実装であり、上記のコードから分かるように、リソースの位置を指定する際に、プレフィクスが「classis path:」に指定されている場合は、Class PathResourceを使用します.