`

Spring学习(七)独立于BeanFactory基础之外的功能

 
阅读更多

(一)国际化:

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实现日志输出会更好。

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics