解析文本信息:
有時(shí),你不希望硬編碼顯示給用戶信息。也許是因?yàn)檫@個(gè)信息經(jīng)常發(fā)生改變,或者是你的應(yīng)用系統(tǒng)提供國(guó)際化功能,你要用用戶的本地語言顯示文本。
java對(duì)文本國(guó)際化的支持使你能夠定義一個(gè)或多個(gè)屬性文件保存應(yīng)用系統(tǒng)中需要顯示的文本。Spring的ApplicationContext通過MessageSource接口為容器提供參數(shù)化信息支持,Spring提供了一個(gè)現(xiàn)成的MessageSource實(shí)現(xiàn)。ResourceBundleMessageSource只是調(diào)用java自己的java.util.ResourceBundle來解析信息。
例如:
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename">
<value>trainingtext</value>
</property>
</bean>
這個(gè)Bean的名字必須是messageSource,因?yàn)锳pplicationContext在裝配應(yīng)用系統(tǒng)Bean的時(shí)候查找這個(gè)名字的Bean,你不需要將messageSource注入到應(yīng)用系統(tǒng)中的Bean中,而是使用ApplicationContext自己的getMessage()方法。
Locale locale = ...;
第一個(gè)參數(shù)表示文本文件中的ID
第二個(gè)參數(shù)表示傳遞到資源文件中的數(shù)組,顯示最終文件
第三個(gè)參數(shù)表示采用哪種方式顯示
String text = context.getMessage("computer",new Object[0],locale);
監(jiān)聽事件與發(fā)布事件:
如果你想對(duì)一個(gè)類的方法進(jìn)行監(jiān)聽,首先要定義事件,然后在這個(gè)方法中通過ApplicationContext發(fā)布它,最后在ApplicationContext.xml中定義這個(gè)監(jiān)聽器。這樣,每當(dāng)方法執(zhí)行的時(shí)候,監(jiān)聽器就會(huì)監(jiān)聽到對(duì)應(yīng)的事件的觸發(fā)。
事件分為ApplicationContext發(fā)布的事件和自定義的事件。這些事件都是抽象類org.springframework.context.ApplicationEvent的子類。
在應(yīng)用系統(tǒng)生命周期中,ApplicationContext會(huì)發(fā)布很多事件,告訴感興趣的監(jiān)聽器發(fā)生了什么事情。。系統(tǒng)事件有如下幾個(gè):
1、ContextClosedEvent:在應(yīng)用上下文關(guān)閉的時(shí)候發(fā)布的事件;
2、contextRefreshedEvent:在應(yīng)用上下文初始化或刷新的時(shí)候發(fā)布的事件;
3、RequestHandledEvent:在web應(yīng)用上下文中,當(dāng)一個(gè)請(qǐng)求被處理后發(fā)布的事件。
首先要編寫為哪個(gè)類的哪個(gè)方法添加事件:
public class Animal implements ApplicationContextAware {
private ApplicationContext ac;
private String name;
private int age;
public String speak(){
ac.publishEvent(new AnimalSpeakEvent(this,this.name));
return " 我的名字是;"+this.name+",我的年齡是:"+this.age;
}
public void setApplicationContext(ApplicationContext arg0) throws BeansException {
this.ac = arg0;
}
//Getet和Seter省略
}
自定義事件入下:
import org.springframework.context.ApplicationEvent;
public class AnimalSpeakEvent extends ApplicationEvent {
private static final long serialVersionUID = 1L;
private String animalName;
public AnimalSpeakEvent(Object source) {
super(source);
}
public AnimalSpeakEvent(Object source,String animalName) {
super(source);
this.animalName = animalName;
}
public String getAnimalName() {
return animalName;
}
}
然后是實(shí)現(xiàn)監(jiān)聽器,監(jiān)聽器必須實(shí)現(xiàn)org.springframework.context.ApplicationListener接口。這個(gè)接口要求你的Bean實(shí)現(xiàn)onApplicationEvent()方法:
public class RefreshListener implements ApplicationListener{
public void onApplicationEvent(ApplicationEvent event){
}
}
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
public class AnimalEventListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof AnimalSpeakEvent) {
AnimalSpeakEvent a = (AnimalSpeakEvent) event;
System.out.println("事件監(jiān)聽器" + this.getClass().getSimpleName()+":有一個(gè)動(dòng)物在講話!它的名字是:"+ a.getAnimalName());
}
}
}
最后就是在映射文件中定義這個(gè)監(jiān)聽器:
<?xml version="1.0" encoding="UTF-8"?>
<beans …………>
<bean id="Listener" class="ioc.test.AnimalEventListener" />
<bean id="Animal" class="ioc.test.Animal">
<property name="name" value="老虎" />
<property name="age" value="5" />
</bean>
</beans>
最后是測(cè)試類:
import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestMain {
public static void main(String[] args) {
AbstractApplicationContext ac = new ClassPathXmlApplicationContext(
"applicationContext.xml");
//從容器獲取動(dòng)物實(shí)例
Animal animal = (Animal)ac.getBean("Animal");
//讓動(dòng)物講話
System.out.println(animal.speak());
}
}
感知其他Bean:
在極大程度上,運(yùn)行在Spring容器中的Bean就像生活在The Matrix里的人類。對(duì)于這些Bean來說,他們不知道自己的注冊(cè)名,甚至不知道自己運(yùn)行在容器中。通常這是好事,因?yàn)槿绻粋€(gè)Bean知道容器的存在的話,他就和Spring耦合在一起了,在容器以外無法存在。
但有時(shí)候Bean需要知道更多信息。有時(shí)他們需要知道他們是誰,他們?cè)谀睦镞\(yùn)行。有時(shí)他們需要服用那顆紅色藥丸。
在Spring Bean環(huán)境中,紅色藥丸就是BeanNameAware、BeanFactoryAware和ApplicationContextAware接口。通過實(shí)現(xiàn)這3個(gè)接口,Bean分別可以知道自己的名字,他們所處的BeanFactory以及他們所處的ApplicationContext.
注意,通過實(shí)現(xiàn)這些接口,一個(gè)Bean就和Spring耦合在一起。
感知系統(tǒng)容器對(duì)于Bean來說是福是禍。一方面,應(yīng)用上下文的獲得給Bean提供了很多權(quán)利。另一方面,知道容器會(huì)把Bean和Spring耦合起來,這是要盡量避免的事情。
posted on 2009-11-03 20:52
王永慶 閱讀(174)
評(píng)論(0) 編輯 收藏 所屬分類:
SPRING