配置信息分离:
PropertyPlaceholderConfigurer是BeanFactoryPostProcessor的实现类,用于读取java properties文件中的属性,然后插入BeanFactory的定义中。
在应用上下文中从单个外部属性文件装载配置信息:
配置单个文件:
<bean id="configurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="db.properties"/>
</bean>
配置多个文件
<bean id="configurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" >
<list>
<value>db.properties</value>
<value>db.properties</value>
<value>db.properties</value>
</list>
</property>
</bean>
这样就可以用占位符变量代替bean配置文件中的硬编码配置了。占位符变量采用${variable}的形式。
事件处理:
Spring的ApplicationContext能够发布事件并且允许注册相应的事件监听器,他拥有一套完善的事件发布和监听机制。Spring事件处理也是通过扩展其定义的事件和事件监听器。
ApplicationEvent:容器事件,必须由ApplicationContext发布。继承EventObject,唯一构造方法ApplicationEvent(Object source)
ApplicationListener:监听器,可以是容器中的任何监听器Bean担任。
事件类:
ApplicationEvent的三个子类:
ContextRefreshedEvent:当容器初始化或刷新时产生该事件,调用容器的refresh方法时,产生该事件。
ContextClosedEvent:当容器关闭时,即调用容器的close方法时,产生该事件。
RequestHandleEvent:这是一个与Web应用相关的事件,当一个HTTP请求被处理后产生该事件。只有在web.xml中定义了DispatcherServlet时才会产生该事件。
public class SendEvent extends ApplicationEvent {
String address;
String name;
public SendEvent(Object source, String name, String address) {
super(source)
this.name = name;
this.address = address;
}
}
事件监听接口:
Spring只有一个事件监听接口,ApplicationListener,继承该接口并实现onApplicationEvent(ApplicationEvent event)方法,在该方法中编写事件的处理逻辑。
public class SendNotifier implements ApplicationListener {
pubnlic void onApplicationEvent(Application evt) {
if(evt instanceof SendEvent) {
// 事件的处理逻辑
} else {
// 容器本身的事件,不需要做任何处理
}
}
}
<bean id="sendListener" class="event.SendListener" />
每当容器发生事件时,此方法就会触发,将监听器配置在容器中。
使用:
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClasspathXmlApploicationContext("beans.xml");
SendEvent event = new SendEvent("name1", "address1");
context.publishEvent(event);
}
}