ApplicationContext学习
相对BeanFactory而言,ApplicationContext提供了以下扩展功能:
1.国际化支持
我们可以在Beans.xml文件中,对程序中的语言信息(如提示信息)进行定义,将程序中的提示
信息抽取到配置文件中加以定义,为我们进行应用的各语言版本转换提供了极大的灵活性。
2.资源访问
支持对文件和URL的访问。
3.事件传播
事件传播特性为系统中状态改变时的检测提供了良好支持。
4.多实例加载
可以在同一个应用中加载多个Context实例。
下面我们就这些特性逐一进行介绍。
1) 国际化支持
配置文件
<beans>
<description>Spring Quick Start</description>
<bean id="messageSource" <!—注意,这里名字必须为messageSource -->
class="org.springframework.context.support.ResourceB
undleMessageSource">
<property name="basenames">
<list>
<value>messages</value>
</list>
</property>
</bean>
</beans>
在配置节点中,我们指定了一个配置名“messages”。Spring会自动在CLASSPATH根路径中按照如下顺序搜寻配置文件并进行加载(以Locale为zh_CN为例):
messages_zh_CN.properties
messages_zh.properties
messages.properties
messages_zh_CN.class
messages_zh.class
messages.class
再加入二个properties文件
示例中包含了两个配置文件,内容如下:
messages_zh_CN.properties:
userinfo=当前登录用户: [{0}] 登录时间:[{1}]
messages_en_US.properties:
userinfo=Current Login user: [{0}] Login time:[{1}]
测试
import java.util.Calendar;
import java.util.Locale;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
publicclass TestAction {
publicstaticvoid main(String[] args) {
ApplicationContext ctx2=new
ClassPathXmlApplicationContext("applicationContext.xml");
Object[] arg = new Object[]{
"Erica",
Calendar.getInstance().getTime()
};
// 以系统默认Locale加载信息(对于中文WinXP而言,默认为zh_CN)
String msg = ctx2.getMessage("userinfo", arg,Locale.US);
System.out.println("Message is ===> "+msg);
}
}
结果
Message is ===> Current Login user: [Erica] Login time:[3/23/09 12:20 PM]
2) 资源访问
ApplicationContext.getResource方法提供了对资源文件访问支持,如:
Resource rs = ctx.getResource("classpath:config.properties");
File file = rs.getFile();
上例从CLASSPATH根路径中查找config.properties文件并获取其文件句柄。
getResource方法的参数为一个资源访问地址,如:
file:C:/config.properties
/config.properties
classpath:config.properties
注意getResource返回的Resource并不一定实际存在,可以通过Resource.exists()方法对
其进行判断。
3)事件传播
ApplicationContext基于Observer模式(java.util包中有对应实现),提供了针对Bean的事件传
播功能。通过Application. publishEvent方法,我们可以将事件通知系统内所有的
ApplicationListener。