您的位置:首页 > 移动开发

【Java.Spring.Core】【IoC】ApplicationContext的附加功能(国际化,未完待续)

2015-01-12 00:09 441 查看
正如前面所述, org.springframework.beans.factory 包提供了管理和操纵beans的基本功能。org.springframework.context包增加了一个 ApplicationContext 接口,其扩展了 BeanFactory接口,使其更加适合应用程序的使用。为了另 BeanFactory 的功能更加适合作为一个框架来使用, context 包提供了下列的功能:通过 MessageSource 接口来以 i18n 方式来访问 message通过ResourceLoader接口访问资源,如URLs或者文件通过ApplicationEventPublicsher接口实现向实现了ApplicationListener接口的beans发送事件通过HierarchiaclBeanFactory接口加载多个Context,这可以另每个特定的Context用于特定的层次,例如应用程序的web层

使用MessageSource接口的国际化(i18n)

ApplicationContext接口继承了 MessageSource 接口,其提供了国际化( i18n) 的功能。Spring同时提供了HierarchicalMessageSource接口,可以用来继承地解析 message。这些接口共同用于 message 的解析。这些接口定义了如下的方法:String getMessage(String code, Object[] args, String default, Locale loc) - 从MessageSource中取出消息的基本方法;如果对于特定的locale,没有message被找到,则使用默认的message;传入的参数作为替代的值String getMessage(String code, Object[] args, Locale loc) - 与前面的方法基本相同,但是如果特定locale的message没有找到,没有默认的message可用,会抛出NoSuchMessageException异常String getMessage(MessageSourceResolvable resolvable, Locale locale) - 前面方法的参数被包裹在类MessageSourceResolvable的对象中Spring提供了两个MessageSource的实现类:ResourceBundleMessageSource和StaticMessageSource。它们都实现了HIerarchicalMessageSource接口。StaticMessageSource使用的较少。ResourceBundleMessageSource示例如下:
<beans>
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>format</value>
<value>exceptions</value>
<value>windows</value>
</list>
</property>
</bean>
</beans>
在上面的例子中,我们在classpath可用的路径中定义了3个资源:format, exception, windows。任何解析 message的请求都将会由 ResourceBundles来解析。假设上例中的两个资源文件为:
# in format.properties
message=Alligators rock!
# in exceptions.properties
argument.required=The {0} argument is required.
使用编程方式使用MessageSource的方式如下,
public static void main(String[] args) {
MessageSource resources = new ClassPathXmlApplicationContext("beans.xml");
String message = resources.getMessage("message", null, "Default", null);
System.out.println(message);
}
输出的结果如下:
Alligators rock!
MessageSource bean定义在beans.xml 配置文件中。 messageSource bean的定义中依赖一些资源(resource bundles),其属性名为 basenames。传入 basenames 属性list中值为属性文件,分别是 format.properites, exceptions.properties, windows.properties。下面的例子展示了查找 message 时使用参数,这些参数被嵌入查找的message中的占位符中:
<beans>

<!-- this MessageSource is being used in a web application -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="exceptions"/>
</bean>

<!-- lets inject the above MessageSource into this POJO -->
<bean id="example" class="com.foo.Example">
<property name="messages" ref="messageSource"/>
</bean>

</beans>
public class Example {

private MessageSource messages;

public void setMessages(MessageSource messages) {
this.messages = messages;
}

public void execute() {
String message = this.messages.getMessage("argument.required",
new Object [] {"userDao"}, "Required", null);
System.out.println(message);
}

}
execute方法的执行结果如下:
The userDao argument is required.
另外的例子,如果希望解析British(en-GB) locale的message,需要创建文件:format_en_GM.properties, exceptions_en_GM.properties, windows_en_GB.properties。我们显示指定使用的Locale,
# in exceptions_en_GB.properties
argument.required=Ebagum lad, the {0} argument is required, I say, required.
public static void main(final String[] args) {MessageSource resources = new ClassPathXmlApplicationContext("beans.xml");String message = resources.getMessage("argument.required",new Object [] {"userDao"}, "Required", Locale.UK);System.out.println(message);}
输出的结果为:
Ebagum lad, the userDao argument is required, I say, required.
我们也可以使用 MessageSourceAware 接口来获取任意定义的MessageSource 引用。我们也可以使用 ReloadableResourceBundleMessageSource 来替代 ResourceBundleMessageSource,其可以从任意Spring resource位置加载属性文件,并且可以实现属性文件的热加载。

标准/自定义事件

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: