(一)国际化:
Spring在国际化方面提供了良好的支持,ApplicationContext继承了org.springframework.context.MessageResource接口,使用getMessage()的各个方法来获取信息资源,从而是实现国际化的目的。
当ApplicationContext被加载的时候,它会自动查找定义在XML中定义的messageResource,spring约定这个bean必须被定义为messageSource。开发人员可以通过org.springframework.context.support.ResourcebundleMessageSource来取得国际化信息。
示例代码:
配置文件:
<!-- 在以下代码中定义了,定义了一个id为messageSource的Bean,
这个Bean的来源是org.springframework.context.support.ResourceBundleMessageSource,设定Bean的basename
为messages,意味着存放信息资源文件的文档的名称为messages.properties 或者 messages.class
-->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename">
<!-- 国际化支持的定义在文件名为messages的文件中 -->
<value>messages</value>
</property>
</bean>
test方法:
ApplicationContext context = new FileSystemXmlApplicationContext("classpath:config.xml");
//设定当前时间
Object[] objects = new Object[]{"HelloWorld",Calendar.getInstance().getTime()};
//国际化支持
String msg = context.getMessage("HelloWorld", objects,Locale.CHINA);
System.out.println("msg=========="+msg);
编写messages.properties配置文件:
##{0}和{1}表示,当外部传入参数时,传入值存放的位置
HelloWorld = 问候语:{0} 问候时间:{1}
运行Test程序,发现输出的内容与要求的不一致,这是Java本身在转码的过程中出现了问题,可以通过转码来解决。
1、将messages.properties拷贝到c盘根目录下,然后在windows命令行窗口输入如下命令:
C:\> native2ascii messages.properties messages.txt
这时在c盘根目录下会产生一个messages.txt文件、
将messages.txt中的内容复制到messages.properties中,覆盖原来的内容。
运行即可。
如果想提供对英语支持,可以加入messages_en_US.properties,
文件内容为:HelloWorld=Language {0} Time {1}
然后修改测试程序,将Locale换为US即可。
(二)资源访问:
Spring提供了对资源文件的存取,ApplicationContext继承了ResourceLoader接口,开发人员可以使用getResource()方法指定资源文件的URL来存取。
1、通过虚拟路径来存取。如果资源文件在classpath下,可以通过如下方式来获取:
ApplicationContext context = new FileSystemXmlApplicationContext("classpath:config.xml");
Resource res = context.getResource("classpath:messages.properties"); //classpath是spring约定的URL的虚拟路径。
2、通过实际路径来存取:
指定标准的url,如“file:”或“http:”
ApplicationContext context = new FileSystemXmlApplicationContext("classpath:config.xml");
Resource res = context.getResource("file:d:/eclipse/workspace/myApp/WEB-INF/src/messages.properties");
3、通过相对路径来存取
ApplicationContext context = new FileSystemXmlApplicationContext("classpath:config.xml");
Resource res = context.getResource("WEB-INF/src/messages.properties");
当通过ApplicationContext获取一个Resource后,就可以通过getFile来来存取资源文件的内容了,可以通过exists()来检查资源文件是否存在;通过isOpen()检查资源文件是否被打开;通过getURL()返回资源文件的URL。
(三)事件传递
ApplicationContext的事件处理是通过ApplicationEvent和ApplicationListener的接口来提供的。通过ApplicationContext的publishEvent()方法来通知ApplicationListener.
一个输出日志信息的示例:
(1)一个继承ApplicationEvent的类:
package com.spring.event;
import org.springframework.context.ApplicationEvent;
public class LogEvent extends ApplicationEvent {
public LogEvent(Object msg) {
super(msg);
}
}
(2)定义一个实现ApplicationListener的类:
package com.spring.event;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
public class LogListener implements ApplicationListener{
public void onApplicationEvent(ApplicationEvent event) {
if(event instanceof LogEvent) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//
sdf.setLenient(false);
String currentDate = sdf.format(new Date());
System.out.println("currDate=="+currentDate);
}
}
}
(3)一个实现ApplicationContextAware的类Log:
package com.spring.event;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class Log implements ApplicationContextAware {
private ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
public int log(String log) {
LogEvent logEvent = new LogEvent(log);
this.applicationContext.publishEvent(logEvent);
return 0;
}
}
(4)配置文件:
<bean id="log" class="com.spring.event.Log"/>
<bean id="listener" class="com.spring.event.LogListener"/>
(5)测试程序:
ApplicationContext context = new FileSystemXmlApplicationContext("classpath:config.xml");
Log log = (Log)context.getBean("log");
log.log("gf");
上述代码只是为了说明Spring的事件传递功能, 其实利用Spring 的AOP实现日志输出会更好。