リソースの読み込み(Spring1.2.1)
ApplicationContextを使用すると,リソースの特定をある程度自動化し,リソース種別(ファイルかネットワーク越しデータかなど)を上位から隠蔽できるようなので,試してみた.
ApplicationContextには,リソースを取得するためのメソッドがある.
Resource getResource(String location)locationには,以下の形式の値が入る.
- 完全修飾のURL.
- classpath:から始まる疑似URL.
- ファイルの相対パス.
- boolean exists()
- リソースの有無を返す.
- String getDescription()
- リソースの記述を返す.
- boolean isOpen()
- リソースのストリームが開いているかどうかを返す.
- InputStream getInputStream() throws IOException
- リソースのストリームを返す.
本頁のサンプルのドライバクラスを以下に示す.
上記サンプルでは,ApplicationContextのgetResourceの引数として,以下を設定している.
String[] resources = new String[] {
"beans.xml",
"org/fireproject/springsample/beans.xml",
"file:org/fireproject/springsample/beans.xml",
"classpath:org/fireproject/springsample/beans.xml",
"build.xml",
"file:build.xml",
"classpath:build.xml",
"http://www.example.com",
};
これらのリソース記述による動作結果を比較することによって,以下のことが分かった.
- URLでリソースを指定できる.
- file:でロケーションを指定すると,ファイルシステムの相対パスでリソースを検索する.
- classpath:でロケーションを指定すると,クラスパスからリソースを検索する.
- 単にリソースのファイル名などを指定しただけだ(頭にclasspath:やfile:やhttp:などをつけない)と,classpath:を指定した場合と同様の動作となる.
$> java -jar springsample.jar
...省略...
HelloApplicationContext:40 - ===== resources[0] = beans.xml
HelloApplicationContext:42 - org.springframework.core.io.ClassPathResource
HelloApplicationContext:43 - resource exist false
HelloApplicationContext:40 - ===== resources[1] = org/fireproject/springsample/beans.xml
HelloApplicationContext:42 - org.springframework.core.io.ClassPathResource
HelloApplicationContext:43 - resource exist true
HelloApplicationContext:75 - === head of class path resource
[org/fireproject/springsample/beans.xml] START
HelloApplicationContext:88 - <?xml version="1.0" encoding="UTF-8"?>
HelloApplicationContext:88 - <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
HelloApplicationContext:88 - <!-- This is beans.xml for springsample -->
HelloApplicationContext:88 -
HelloApplicationContext:88 - <beans>
HelloApplicationContext:96 - === head of class path resource
[org/fireproject/springsample/beans.xml] END
HelloApplicationContext:40 - ===== resources[2] = file:org/fireproject/springsample/beans.xml
HelloApplicationContext:42 - org.springframework.core.io.UrlResource
HelloApplicationContext:43 - resource exist false
HelloApplicationContext:40 - ===== resources[3] = classpath:org/fireproject/springsample/beans.xml
HelloApplicationContext:42 - org.springframework.core.io.ClassPathResource
HelloApplicationContext:43 - resource exist true
HelloApplicationContext:75 - === head of class path resource
[org/fireproject/springsample/beans.xml] START
HelloApplicationContext:88 - <?xml version="1.0" encoding="UTF-8"?>
HelloApplicationContext:88 - <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
HelloApplicationContext:88 - <!-- This is beans.xml for springsample -->
HelloApplicationContext:88 -
HelloApplicationContext:88 - <beans>
HelloApplicationContext:96 - === head of class path resource
[org/fireproject/springsample/beans.xml] END
HelloApplicationContext:40 - ===== resources[4] = build.xml
HelloApplicationContext:42 - org.springframework.core.io.ClassPathResource
HelloApplicationContext:43 - resource exist true
HelloApplicationContext:75 - === head of class path resource [build.xml] START
HelloApplicationContext:88 - <?xml version="1.0"?>
HelloApplicationContext:88 -
HelloApplicationContext:88 - <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
HelloApplicationContext:88 - <!-- iText, a JAVA - PDF library
-->
HelloApplicationContext:88 - <!-- $Id: build.xml,v 1.5 2004/12/19
09:11:05 blowagie Exp $ -->
HelloApplicationContext:96 - === head of class path resource [build.xml] END
HelloApplicationContext:40 - ===== resources[5] = file:build.xml
HelloApplicationContext:42 - org.springframework.core.io.UrlResource
HelloApplicationContext:43 - resource exist true
HelloApplicationContext:75 - === head of URL [file:build.xml] START
HelloApplicationContext:88 - <?xml version="1.0" ?>
HelloApplicationContext:88 - <!-- $Id: build.xml.eucjp,v 1.2 2005/03/21
13:00:11 matsu Exp $ -->
HelloApplicationContext:88 - <project name="gcmon" default="buildmain">
HelloApplicationContext:88 -
HelloApplicationContext:88 - <property file="${basedir}/build.properties"/>
HelloApplicationContext:96 - === head of URL [file:build.xml] END
HelloApplicationContext:40 - ===== resources[6] = classpath:build.xml
HelloApplicationContext:42 - org.springframework.core.io.ClassPathResource
HelloApplicationContext:43 - resource exist true
HelloApplicationContext:75 - === head of class path resource [build.xml] START
HelloApplicationContext:88 - <?xml version="1.0"?>
HelloApplicationContext:88 -
HelloApplicationContext:88 - <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
HelloApplicationContext:88 - <!-- iText, a JAVA - PDF library
-->
HelloApplicationContext:88 - <!-- $Id: build.xml,v 1.5 2004/12/19
09:11:05 blowagie Exp $ -->
HelloApplicationContext:96 - === head of class path resource [build.xml] END
HelloApplicationContext:40 - ===== resources[7] = http://www.example.com
HelloApplicationContext:42 - org.springframework.core.io.UrlResource
HelloApplicationContext:43 - resource exist true
HelloApplicationContext:75 - === head of URL [http://www.example.com] START
HelloApplicationContext:88 - <HTML>
HelloApplicationContext:88 - <HEAD>
HelloApplicationContext:88 - <TITLE>Example Web Page</TITLE>
HelloApplicationContext:88 - </HEAD>
HelloApplicationContext:88 - <body>
HelloApplicationContext:96 - === head of URL [http://www.example.com] END
classpath:build.xmlを指定した場合は,どっかのjarに含まれているbuild.xmlを読みだしているようだ.

