Spring基于注解的配置(2)
Spring 中的事件处理
我们之前已经了解到Spring 的核心是 ApplicationContext,它负责管理 beans 的完整生命周期。当加载 beans 时,ApplicationContext 发布某些类型的事件。例如,当上下文启动时,ContextStartedEvent 发布,当上下文停止时,ContextStoppedEvent 发布。
通过 ApplicationEvent 类和 ApplicationListener 接口来提供在 ApplicationContext 中处理事件。如果一个 bean 实现 ApplicationListener,那么每次 ApplicationEvent 被发布到 ApplicationContext 上,那个 bean 会被通知。
Spring 提供了以下的标准事件:
序号 | Spring内置事件&描述 |
---|---|
1 | ContextRefreshedEvent: ApplicationContext 被初始化或刷新时,该事件被发布。这也可以在 ConfigurableApplicationContext 接口中使用 refresh() 方法来发生。 |
2 | ContextStartedEvent:当使用 ConfigurableApplicationContext 接口中的 start() 方法启动 ApplicationContext 时,该事件被发布。你可以调查你的数据库,或者你可以在接受到这个事件后重启任何停止的应用程序。 |
3 | ContextStoppedEvent:当使用 ConfigurableApplicationContext 接口中的 stop() 方法停止 ApplicationContext 时,发布这个事件。你可以在接受到这个事件后做必要的清理的工作。 |
4 | ContextClosedEvent:当使用 ConfigurableApplicationContext 接口中的 close() 方法关闭 ApplicationContext 时,该事件被发布。一个已关闭的上下文到达生命周期末端;它不能被刷新或重启。 |
5 | RequestHandledEvent:这是一个 web-specific 事件,告诉所有 bean HTTP 请求已经被服务。 |
由于 Spring 的事件处理是单线程的,所以如果一个事件被发布,直至并且除非所有的接收者得到的该消息,该进程被阻塞并且流程将不会继续。因此,如果事件处理被使用,在设计应用程序时应注意。
监听上下文事件
为了监听上下文事件,一个 bean 应该实现只有一个方法 onApplicationEvent() 的 ApplicationListener 接口。
实例:
- 在eclipse中新建一个名为autowire的Java工程
- 带入spring所需要的包
- 在src下新建一个名为autoTest05的包,在包下新建MainTest.java,Tstudent05.java,和Tteacher05.java三个class文件
- 在src下创建Beans.xml文件
MainTest.java内容如下:
package autowireTest05;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
context.start();
Tstudent05 student = (Tstudent05)context.getBean("Tstudent05");
System.out.println(student);
context.stop();
}
}
Tstudent05.java内容如下:
package autowireTest05;
public class Tstudent05 {
private String name;
public void setName(String name) {
this.name = name;
}
public String toString() {
return "my name is "+name;
}
}
startEvent.java的内容如下:
package autowireTest05;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextStartedEvent;
public class startEvent implements ApplicationListener<ContextStartedEvent>{
public void onApplicationEvent(ContextStartedEvent arg0) {
System.out.println("this is StartEvent!!");
}
}
stopEvent.java的内容如下:
package autowireTest05;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextStoppedEvent;
public class stopEvent implements ApplicationListener<ContextStoppedEvent>{
public void onApplicationEvent(ContextStoppedEvent arg0) {
System.out.println("this is StopEvent!!");
}
}
Beans.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:annotation-config/>
<bean id="Tstudent01" class="autowireTest01.Tstudent" autowire="byName">
<property name="name" value="zs"></property>
</bean>
<bean id="teacher" class="autowireTest01.Tteacher">
<property name="name" value="ls"></property>
</bean>
<bean id="Tstudent02" class="autowireTest02.Tstudent02" autowire="constructor">
<constructor-arg value="zs"></constructor-arg>
</bean>
<bean id="teacher02" class="autowireTest02.Tteacher02">
<property name="name" value="ls"></property>
</bean>
<bean id="Tteacher03" class="autowireTest03.Tteacher03">
<property name="name" value="ls"></property>
</bean>
<bean id="Tstudent03" class="autowireTest03.Tstudent03">
<property name="name" value="zs"></property>
</bean>
<bean id="Tstudent04" class="autowireTest04.Tstudent04">
<property name="name" value="zs"></property>
</bean>
<bean id="Tteacher041" class="autowireTest04.Tteacher04">
<property name="name" value="ls"></property>
</bean>
<bean id="Tteacher042" class="autowireTest04.Tteacher04">
<property name="name" value="ww"></property>
</bean>
<bean id="startEvent" class="autowireTest05.startEvent"></bean>
<bean id="stopEvent" class="autowireTest05.stopEvent"></bean>
<bean id="Tstudent05" class="autowireTest05.Tstudent05"></bean>
</beans>
输出结果: