spring-第二篇ApplicationContext国际化及事件机制

1、ApplicationContext接口获取spring容器

     ApplicationContextBeanFactory接口的子接口,BeanFactory的常用实现类是DefaultListablebBeanFactory。

     实例化BeanFactory常用的方式:

     1> 第一种

//搜索类加载路径下的beans.xml文件创建Resource对象
Resource isr=new ClassPathResource("beans.xml");
//创建默认的BeanFactory容器
DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory();
//让默认的BeanFactory容器加载isr对应的XML配置文件
new XmlBeanDefinitionReader(beanFactory).loadBeanDefinitions(isr);

     2> 第二种

//搜索类加载路径下的beans.xml文件创建Resource对象
Resource isr=new FileSystemResource("beans.xml");
//创建默认的BeanFactory容器
DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory();
//让默认的BeanFactory容器加载isr对应的XML配置文件
new XmlBeanDefinitionReader(beanFactory).loadBeanDefinitions(isr);

     如果需要加载多个配置文件来创建spring容器,则应该使用BeanFactory的子接口ApplicationContext来创建BeanFactory的实例。

ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml","service.xml");

     或

ApplicationContext ctx=new FileSystemXmlApplicationContext("beans.xml","service.xml");

    ApplicationContext是spring容器最常用的接口,该接口常用的实现类有:
        1》ClassPathXmlApplicationContext:从类加载路径下搜索配置文件,并根据配置文件创建spring容器
        2》FileSystemXmlApplicationContext:从文件系统的相对路径或绝对路径下去搜索配置文件,并根据配置文件创建spring容器

        3》AnnotationConfigApplicationCotext:常用于注解方式

        4》XmlWebApplicationContext:常用于Web应用中

        5》ApplicationConfigWebApplicationContext:常用于Web应用中

    ApplicationContext默认会初始化所有的singleton bean(单例bean),预初始化的时机就是ApplicationContext创建spring容器的时候,可以通过配置取消与初始化功能,如在<bean.../>元素指定lazy-init="true",该属性用于阻止容器预初始化该bean。BeanFactory则不会预初始化singleton bean。ApplicationContext继承MessageSource,因此支持国际化功能。

2、ApplicationContext的国际化支持

     两个MessageSource接口中定义的方法:

         1》String getMessage(String code,Object[] args,Locale loc)

         2》String getMessage(String code,Object[] args,String default,Locale loc)

     当程序创建ApplicationContext容器的时候,spring自动查找配置文件中名为messageSource的bean实例。一旦找到该bean,上述两个方法的调用就会委托给该messageSourfe bean。如果没有找到该bean,AplicationContext会查找其父容器中的messageSource bean;如果找到,它将作为messageSource bean使用。如果没有找到messageSource bean,系统将创建一个空的StaticMessageSource bean,该bean能接受上述两个方法的调用。

     在spring中配置messageSource bean时通常使用ResourceBundleMessageSource类。例如如下简单例子:

     

      beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- spring配置文件的根元素,使用spring-beans-4.0.xsd语义约束 -->
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
       
       <bean id="messageSource"
             class="org.springframework.context.support.ResourceBundleMessageSource">
             <!-- 驱动spring调用messageSource bean的setBasenames()方法,
                                                      该方法需要一个数组参数,使用list元素配置多个数组元素 -->
             <property name="basenames">
                 <list>
                    <value>message</value>
                    <!-- 如果有多个资源文件,全部列在此处 -->
                 </list>
             </property>
       </bean>
</beans>

     message_en_US.properties

hello=welcome,{0}
now=now is :{0}

     message.properties

hello=欢迎你,{0}
now=现在时间是:{0}

     由于message.properties中包含非西欧文字,中文字符在运行过程当中可能会出现乱码,所以使用natice2ascii命令做转换处理。

    处理完成以后,将在同目录产生一个message_zh_CN.properties文件。

     编写SpringTest.java

package com.lfy.main;

import java.util.Date;
import java.util.Locale;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringTest {

    public static void main(String[] args){

        ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
        String hello=ctx.getMessage("hello",new String[] {"孙悟空"}, Locale.getDefault(Locale.Category.FORMAT));
        String now=ctx.getMessage("now",new Object[] {new Date()},Locale.getDefault(Locale.Category.FORMAT));
        System.out.println(hello);
        System.out.println(now);
    }

}

      运行检查结果:

posted @ 2019-08-11 16:50  ZeroMZ  阅读(620)  评论(0编辑  收藏  举报