文章目录
1.15 附加的功能
org.springframework.beans.factory
包提供了基础的功能去管理多样性的Bean,包括以编程的方式。这个org.springframe.context
包添加了ApplicationContext
接口,来扩展BeanFactory
以提供更多面向框架的风格。很多用户完全以声明式来使用ApplicationContext
接口,但是会依赖Contextloader
去加载ApplicationContext
去为java EE WEB应用做准备。
- 以i18n-style发送消息,通过
MessageSource
接口 - 通过URLS和files等加载资源,通过ResourceLoader接口
- 通过
ApplicationListener
接口来发布消息,通过使用ApplicationEventPublisher
来发送消息 - 层次化的加载多个Context,让每一个位于特殊的layer,就像一个application的web layer,通过
HierarchicalBeanFactory
接口。
15.1 使用MessageSource的初始化
接口方法
ApplicationContext接口集成接口MessageSource
,因此提供了一个国际化的功能i18n
。Spring 也提供了HierarchicalMessageSource
接口–能够层次化的处理消息。这些接口能够提供关于Spring处理消息的解决方案。方法定义的接口包括。
- String getMessage(String code, Object[] args, String default, Locale loc)
基础的方法用于从MessageSource
获取消息,当没有消息说,会返回一个默认的消息。任何消息都必须符合MessageFormat
消息格式,通过替换MessageFormat
类的属性值。 - String getMessage(String code, Object[] args, Locale loc)
潜在的和上一个方法提供功能一致,就是没有默认方法。如果没有消息,NoSuchMessageExceotion
就会被抛出 - String getMessage(MessageSourceResolvable resolvable, Locale locale)
所有属性像前两个方法,这次被包裹在MessageSourceResolvable对象里,如果没有消息,NoSuchMessageExceotion
就会被抛出
加载机制
当一个ApplicationContext被加载的时候,会自动寻找并加载MessageSource
bean。而且这个beMan必须有name:messageSource
。在MessageSource
bean被加载后,那么所有的方法都会被委托给这个bean。如果不能找到,那么一个空的DelegatingMessageSource
就会被初始化。
Spring提供了两种MessageSource
ResourceBundleMessageSource 和 StaticMessageSource。都实现了HierachialMessageSource。StaticMessageSource
很少备用到,但是提供编程化的方式去向Source添加message。
ResourcrBundleMessageSource的示例
这三种值对应的属性文件,放置在classpath
执行代码去验证
总结
MessageSource定义在beans.xml
中,存在classpath的根目录下。messageSource定义了一堆resource bundles属性文件,通过basenames
属性。这三个文件也都相应的存在classpath的根目录下–format.properties,exception.properties和windows.pro