ファイヤープロジェクト
ApplicationContextとMessageSource(Spring1.2.1)
2005-07-17T14:45+09:00   matsu
BeanFactoryの拡張であるApplicationContextは,メッセージをプロパティファイルから読み込んで,上位から指定されたキーで取り出す仕組みを提供している.
ApplicationContextは,BeanFactoryを拡張し,いろいろな便利な機能を備えている. 以下の四つが基本的かつ主要な拡張である.
  • MessageSourceの提供
  • リソースへのアクセス
  • イベント伝播
  • 階層化された複数のコンテキストのロード
本頁ではMessageSourceの提供機能を試してみる. それ以外は次頁以降にて随時試して行く.
ApplicationContextは,beans.xmlに
messageSource
という名前のbeanがあると,そのbeanをMessageSourceとして自動的に認識する. 以下に本頁のサンプルのbeans.xmlを以下に示す.
id値messageSourceのbeanのクラスはResourceBundleMessageSourceである. このクラスは,プロパティbeannamesで指定したbasenameを持つファイルを,クラスパス上から探し,メッセージファイルとして読み込み,上位にメッセージを提供する. 上の例では,要素basenamesの子要素にてmessage-resource1,message-resource2,message-resource3を指定している. 例えばmessage-resource1の指定にて,
message-resource1_ロケール.properties
というファイルがクラスパス上にあれば,メッセージファイルとして読み込まれる. basenameのより厳密なクラスあるいはファイルの特定ロジックは,JDKのAPIを参照されたい. 一方,ApplicationContextには,以下の三つのメッセージ取得メソッドがある(※).
String 	getMessage(MessageSourceResolvable resolvable, Locale locale)
String 	getMessage(String code, Object[] args, Locale locale)
String 	getMessage(String code, Object[] args, String defaultMessage, Locale locale) 
これらのメソッドは,MessageSourceからメッセージを取得して返す. 下二つの引数の意味について調べてみた.
code
メッセージのキーであり,メッセージのプロパティファイルの左辺である.
args
メッセージに埋め込む動的な値である. args[i]は,プロパティファイルの右辺にある{i}に埋め込まれる.
locale
メッセージのロケール. localeの値にja_JPを指定すると,
message-resource1_ja_JP.properties
からメッセージを探して返す.
defaultMessage
指定したcode,localeにてメッセージが見付からない場合に返すメッセージ. これを指定せずにメッセージが見付からない場合は,org.springframework.context.NoSuchMessageExceptionがスローされ,キャッチしなければアプリケーションは停止する.
※ より厳密には親インタフェース
org.springframework.context.MessageSource
を実装したものである.
サンプルのドライバクラスを以下に示す.
上のドライバでは,これらのファイルにて設定したメッセージを取り出して表示する. 特に,message-resource3_ja_JP.propertiesには,埋め込み指定をしてみた.
message5=foo-{0}
message6=var-{0}-{1}
先述の通り,サンプルのbeans.xmlでは三つのメッセージプロパティファイルを指定している. これはディレクトリconfの下にあり,ビルド時にnative2asciiして,jarに取り込んでいる.
$> jar tvf springsample.jar 
     0 Sun Jul 17 14:41:46 JST 2005 META-INF/
  2063 Sun Jul 17 14:41:44 JST 2005 META-INF/MANIFEST.MF
   709 Sun Jul 17 14:41:42 JST 2005 log4j.xml
    34 Sun Jul 17 14:41:42 JST 2005 message-resource1_ja_JP.properties
    44 Sun Jul 17 14:41:42 JST 2005 message-resource2_ja_JP.properties
    38 Sun Jul 17 14:41:42 JST 2005 message-resource3_ja_JP.properties
     0 Sun Jul 17 14:41:42 JST 2005 org/
     0 Sun Jul 17 14:41:42 JST 2005 org/fireproject/
     0 Sun Jul 17 14:41:46 JST 2005 org/fireproject/springsample/
  3246 Sun Jul 17 14:41:46 JST 2005
                org/fireproject/springsample/HelloApplicationContext.class
   479 Sun Jul 17 14:41:42 JST 2005 org/fireproject/springsample/beans.xml
では,実行結果.
$> java -jar springsample.jar 
...省略...
support.AbstractBeanFactory:219 - Creating shared instance of singleton bean 'messageSource'
support.AbstractApplicationContext:413
  - Using MessageSource [
   org.springframework.context.support.ResourceBundleMessageSource:
    basenames=[message-resource1,message-resource2,message-resource3]]
support.AbstractApplicationContext:444
   - Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster':
  using default [org.springframework.context.event.SimpleApplicationEventMulticaster@1d15445]
support.DefaultListableBeanFactory:262
  - Pre-instantiating singletons in factory
  [org.springframework.beans.factory.xml.XmlBeanFactory defining beans
   [messageSource]; root of BeanFactory hierarchy]
springsample.HelloApplicationContext:38 - hoge
springsample.HelloApplicationContext:38 - ふが
springsample.HelloApplicationContext:38 - フー
springsample.HelloApplicationContext:38 - バー
springsample.HelloApplicationContext:45 - foo-555
springsample.HelloApplicationContext:53 - var-666-XXX
springsample.HelloApplicationContext:61 - メッセージが見付かりません.
うまくメッセージが読み込めた.
matsu(C)
Since 2002
Mail to matsu