`

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

 

 

分享到:
评论

相关推荐

    Spring_2.0_Samples

    它允许我们定义关注点(如日志、事务管理等)并将其模块化,独立于业务逻辑之外。Spring AOP支持使用注解定义切面,如`@Before`、`@After`和`@Around`,这使得切面的编写更加直观。 Spring MVC是Spring框架中用于...

    Tom Spring5源码分析

    - **工厂方法模式**(Factory Method): 除了`BeanFactory`之外,Spring还使用了工厂方法模式来进一步解耦对象的创建和使用。例如,可以通过自定义工厂Bean来创建复杂的对象,这使得Spring能够管理和控制更多的对象...

    spring 培训资料

    总的来说,Spring作为一个一站式企业级应用框架,其强大的功能涵盖了从基础设施到业务逻辑的各个层面,而且其无侵入性设计使得开发者可以自由选择使用哪些组件,而不会对整体架构造成太大影响。学习和掌握Spring,...

    开源框架 Spring Gossip

    ApplicationContext 除了具备如 BeanFactory 基本的容器管理功能之外,并支援更多应用程式框架的特性,像是资源的取得、讯息解析、事件的处理与传播。 Resource 的取得 解析文字讯息 倾听事件 ...

    Spring的面试题和答案

    Spring支持这些工具的集成,并且其事务管理功能也适用于这些ORM工具以及JDBC。 #### 9. Web模块 - **Web Module**: 构建在ApplicationContext模块基础之上,提供了适合Web应用的上下文。它还包括对多种Web任务的...

    Spring考试试卷.docx

    - Core Container(核心容器)由BeanFactory组成,它是Spring的基础。 - ApplicationContext是核心模块的一部分,它扩展了BeanFactory,提供了更多企业级服务。 14. **Spring管理的Bean**: - Spring管理的Bean...

    Spring考试试卷(有答案).docx

    13. Spring的7个模块:Spring框架的各模块可以独立存在并使用,如Core Container(核心容器)模块中的BeanFactory是Spring的基础,而ApplicationContext模块提供了更丰富的容器功能。 14. Spring中的Bean:Spring...

    Spring考试试卷 (2).docx

    Spring 框架是Java企业级应用开发的重要组成部分,它提供了许多功能,包括依赖注入(DI)、面向切面编程(AOP)、事务管理等。在上述的考试试卷中,涉及了Spring的一些关键知识点,让我们逐一解析。 1. AOP(面向切...

    八股知识点自我整理.md

    1. **Spring**:Spring是整个框架的基础,提供了核心的依赖注入(DI)和面向切面编程(AOP)功能,是所有Spring家族成员的基础。 2. **SpringMVC**:SpringMVC是Spring框架下的一个子项目,专注于Web应用程序开发,...

    Sring考试试卷有答案.docx

    每个模块可以独立使用,例如 BeanFactory 是核心模块的一部分,提供了容器的基础,而上下文模块扩展了核心模块,形成了一个更全面的应用程序上下文容器。 8. **Spring Bean** Spring 中的 Bean 并不特指符合 ...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.70.docx

    2. Spring框架的IoC容器:Spring的IoC容器(如BeanFactory和ApplicationContext)负责管理组件(Bean)的生命周期和依赖注入,降低组件间的耦合度,提高代码的灵活性和可维护性。 3. 微服务架构:微服务将应用拆分...

    SSH-Jsp期末考试简答题带答案

    ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能,如国际化支持、资源访问、时间传递等。 4. Struts2 的工作流程 Struts2 是一个基于Java的Web应用框架,它提供了MVC...

    23种设计模式案例.rar

    Spring中的`BeanFactory`和`ApplicationContext`就是工厂模式的应用。 3. **建造者模式**:将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。Spring JDBC的`JdbcTemplate`和`...

Global site tag (gtag.js) - Google Analytics