Spring ApplicationContext

ApplicationContext是一个IoC容器,但它扩展了IoC容器的许多功能:例如像资源的获取,国际化,事件的处理和传播等,你可以基于Spring容器来打造自己的应用程序框架。

首先我们通过ApplicationContext的源代码分析一下:

public interface ApplicationContext extends ListableBeanFactory, HierarchicalBeanFactory,
		MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
                             ...
}

资源的获取: 

Spring提供了对资源文件的泛型存取,ApplicationContext它继承了org.springframework.core.io.ResourceLoader接口,你可以使用getResource()方法并指定资源文件的URL来取的一个实现Resource接口的实例。

例如:Resource res=context.getResource("classpath:admin.properties");

 

国际化:

ApplicationContext它继承了org.springframework.context.MessageSource接口,你可以使用getMessage()的各种版本的方法来取得文字消息的资源文件,从而实现国际化消息的目的。

你可以通过MessageSource的一个实现ResourceBundleMessageSource来取得国际化消息。

下面我们来实例里来说明:

首先定义一个配置文件:

<?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans.xsd
">
<!-- basename 属性用来设置消息资源的前置档案文件名称,在这边设置是messages,表示
消息资源文件的名称可以是messages_en_US.properties等名称 -->
	<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basename" value="messages"></property>
	</bean>
</beans>

 接着提供资源文件:这里提供两个资源文件一个是美式英语系的,另一个是中文系的

messages_en_US.properties

 

userLogin=User {0} login at {1}

 

messages_zh_TW.properties(由于直接使用Big5中文编码容器出现乱码,这里使用native2ascii进行了编码的转换)

 

userLogin=\u7528\u6237 {0} \u4E8E {1} \u767B\u5F55

 

测试类:

package com.messagesource;

import java.util.Calendar;
import java.util.Locale;

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

public class MessageSourceDemo {
	public static void main(String[] args) {
		ApplicationContext ac=new ClassPathXmlApplicationContext("beans-config.xml");
		Object[] arguments=new Object[]{"乔彦辉",Calendar.getInstance().getTime()};
		/*
		 * getMessage(String code, Object[] args, Locale locale)
		 * 第一个参数表示属性文件中的key
		 * 第二个参数表示填充参数列表
		 * 第三个参数表示语言
		 */
		System.out.println(ac.getMessage("userLogin",arguments,Locale.US));
		System.out.println(ac.getMessage("userLogin",arguments,Locale.TAIWAN));
	}

}

 

输出结果为:

User 乔彦辉 login at 10/6/10 1:14 PM
用户 乔彦辉 于 2010/10/6 下午 1:14 登录

 监听事件:

在Spring应用程序执行期间,ApplicationContext本身就会发布一连串的事件,所有发布的事件都是抽象类org.springframework.context.ApplicationEvent的子类。例如:

ContextClosedEvent  在ApplicationContext关闭时发布的事件

ContextRefreshedEvent在初始化或refresh会发布的事件

RequestHandledEvent 在Web应用程序中,当请求被处理时,ApplicationContext会发布此事件。

如果你对这些事件感兴趣可以实现org.springframework.context.ApplicationListener接口。

ConsoleListener  仅在Debug时使用,会在文字模式下显示记录ApplicationContext的相关消息。

PerformanceMonitorListerner  在web应用程序中,搭配WebApplicationContext使用,可记录请求 的回应时间。

事件传播:

你可以使用ApplicationContext的publishEvent()方法来传播事件。

现在我们来实现一个简单的事件捕获的例子:

首先我们来定义一个事件:

package com.spring.ch042;

import org.springframework.context.ApplicationEvent;

public class MessageEvent extends ApplicationEvent{
	private static final long serialVersionUID = 1L;
	private String message;
	public MessageEvent(Object source,String message) {
		super(source);
		this.message=message;
	}
	public String getMessage(){
		return this.message;
	}
}

 

接着我们一个监听器,用来监听事件,并注册

package com.spring.ch042;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

public class MessageEventListener implements ApplicationListener{
	public void onApplicationEvent(ApplicationEvent event) {
		if(event instanceof MessageEvent){
			MessageEvent messageEvent=(MessageEvent)event;
			System.out.println("Received "+messageEvent.getMessage()+" from "+
					messageEvent.getSource());
		}
		
	}

}

 

<?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans.xsd
">
<bean id="publisher" class="com.spring.ch042.EventPublisherDemo"/>
<!-- 注册监听器 -->
<bean class="com.spring.ch042.MessageEventListener"/>
   
 </beans>

 

 

最后我们来测试一下:

 

 

 

package com.spring.ch042;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class EventPublisherDemo implements ApplicationContextAware{
	private ApplicationContext ctx;
	public void setApplicationContext(ApplicationContext ctx)
			throws BeansException {
		this.ctx=ctx;
	}
	public static void main(String[] args) {
		ApplicationContext ctx=new ClassPathXmlApplicationContext("/META-INF/eventdemo.xml");
		EventPublisherDemo pub=(EventPublisherDemo)ctx.getBean("publisher");
		pub.publish("Hello");
		pub.publish("The quick brown fox jumped over the lazy dog");
		
	}
	public void publish(String message){
		//发布事件
		this.ctx.publishEvent(new MessageEvent(this,message));
	}
}

 

输出结果为:

Received Hello from com.spring.ch042.EventPublisherDemo@a31e1b
Received The quick brown fox jumped over the lazy dog from com.spring.ch042.EventPublisherDemo@a31e1b

 到这里ApplicationContext常用的功能就介绍完了。如果大家知道其他的功能,希望指点。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值