ApplicationContextとMessageSource(Spring1.2.1)
BeanFactoryの拡張であるApplicationContextは,メッセージをプロパティファイルから読み込んで,上位から指定されたキーで取り出す仕組みを提供している.
ApplicationContextは,BeanFactoryを拡張し,いろいろな便利な機能を備えている.
以下の四つが基本的かつ主要な拡張である.
- MessageSourceの提供
- リソースへのアクセス
- イベント伝播
- 階層化された複数のコンテキストのロード
ApplicationContextは,beans.xmlに
id値messageSourceのbeanのクラスはResourceBundleMessageSourceである.
このクラスは,プロパティbeannamesで指定したbasenameを持つファイルを,クラスパス上から探し,メッセージファイルとして読み込み,上位にメッセージを提供する.
上の例では,要素basenamesの子要素にてmessage-resource1,message-resource2,message-resource3を指定している.
例えばmessage-resource1の指定にて,
messageSourceという名前のbeanがあると,そのbeanをMessageSourceとして自動的に認識する. 以下に本頁のサンプルのbeans.xmlを以下に示す.
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 - メッセージが見付かりません.
うまくメッセージが読み込めた.

