本文轉載僅供自己學習收錄,不做任何商業用途,如有需要請訪問文章原地址:http://blog.csdn.net/qyf_5445/article/details/8124306
code表示國際化資源中的屬性名;
args用於傳遞格式化串占位符所用的運行期參數;當在資源找不到對應屬性名時,返回defaultMessage參數所指定的默認信息;
locale表示本地化對象;
MessageSourceResolvable 將屬性名、參數數組以及默認信息封裝起來,它的功能和第一個接口方法相同。
MessageSource的類結構
MessageSource分別被HierarchicalMessageSource和ApplicationContext接口擴展,這里我們主要看一下HierarchicalMessageSource接口的幾個實現類,如圖5-7所示。
![]() |
該接口的setParentMessageSource (MessageSource parent)方法用於設置父MessageSource,而getParentMessageSource()方法用於返回父MessageSource。
HierarchicalMessageSource接口最重要的兩個實現類是ResourceBundleMessageSource和ReloadableResourceBundleMessageSource。它們基於Java的ResourceBundle基礎類實現,允許僅通過資源名加載國際化資源。
ReloadableResourceBundleMessageSource提供了定時刷新功能,允許在不重啟系統的情況下,更新資源的信息。
StaticMessageSource主要用於程序測試,它允許通過編程的方式提供國際化信息。
DelegatingMessageSource是為方便操作父MessageSource而提供的代理類。
ResourceBundleMessageSource該實現類允許用戶通過beanName指定一個資源名(包括類路徑的全限定資源名),或通過beanNames指定一組資源名。
在代碼清單5-15中,我們通過JDK的基礎類完成了本地化的操作,下面我們使用ResourceBundleMessageSource來完成相同的任務。讀者可以比較兩者的使用差別,並體會spring所提供的國際化處理功能所帶給我們的好處:
![]() |
啟動Spring容器,並通過MessageSource訪問配置的國際化資源,如代碼清單 5 17所示:
![]() |
比較代碼清單5-15中的代碼,我們發現最主要的區別在於我們無須再分別加載不同語言、不同國家/地區的本地化資源文件,僅僅通過資源名就可以加載整套的國際化資源文件。此外,我們無須顯式使用MessageFormat操作國際化信息,僅通過MessageSource# getMessage()方法就可以完成操作了。這段代碼的運行結果與代碼清單5 15的運行結果完全一樣。
ReloadableResourceBundleMessageSource
前面,我們提到該實現類比之於ResourceBundleMessageSource的唯一區別在於它可以定時刷新資源文件,以便在應用程序不重啟的情況下感知資源文件的變化。很多生產系統都需要長時間持續運行,系統重啟會給運行帶來很大的負面影響。這時,通過該實現類就可以解決國際化信息更新的問題。請看下面的配置:
![]() |
![]() |