ファイヤープロジェクト
リソースの読み込み(Spring1.2.1)
2005-07-18T18:45+09:00   matsu
ApplicationContextを使用すると,リソースの特定をある程度自動化し,リソース種別(ファイルかネットワーク越しデータかなど)を上位から隠蔽できるようなので,試してみた.
ApplicationContextには,リソースを取得するためのメソッドがある.
Resource getResource(String location)
locationには,以下の形式の値が入る.
  • 完全修飾のURL.
  • classpath:から始まる疑似URL.
  • ファイルの相対パス.
Resourceには,実際のリソースの種類(ネットワーク上のファイル,ローカルのファイル,JAR内のファイルなど)に応じて,具象クラスがあり,ApplicationContextは,自動的に具象クラスを判別,インスタンス化して返す. Resourceには,以下のメソッドがある.
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:を指定した場合と同様の動作となる.
上記の形式でリソースのロケーションを指定したあとは,getResourceして,existsで存在を確認している. 存在する場合は,ドライバのプライベートメソッドheadResourceにて,リソースからgetInputStreamして,冒頭の数行を出力している. 以下にサンプルの実行結果を示す.
$> 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を読みだしているようだ.
matsu(C)
Since 2002
Mail to matsu