spring学习笔记4-Spring基于注解的配置(2)

Spring基于注解的配置(2)

Spring 中的事件处理
我们之前已经了解到Spring 的核心是 ApplicationContext,它负责管理 beans 的完整生命周期。当加载 beans 时,ApplicationContext 发布某些类型的事件。例如,当上下文启动时,ContextStartedEvent 发布,当上下文停止时,ContextStoppedEvent 发布。

通过 ApplicationEvent 类和 ApplicationListener 接口来提供在 ApplicationContext 中处理事件。如果一个 bean 实现 ApplicationListener,那么每次 ApplicationEvent 被发布到 ApplicationContext 上,那个 bean 会被通知。

Spring 提供了以下的标准事件:

序号Spring内置事件&描述
1ContextRefreshedEvent: ApplicationContext 被初始化或刷新时,该事件被发布。这也可以在 ConfigurableApplicationContext 接口中使用 refresh() 方法来发生。
2ContextStartedEvent:当使用 ConfigurableApplicationContext 接口中的 start() 方法启动 ApplicationContext 时,该事件被发布。你可以调查你的数据库,或者你可以在接受到这个事件后重启任何停止的应用程序。
3ContextStoppedEvent:当使用 ConfigurableApplicationContext 接口中的 stop() 方法停止 ApplicationContext 时,发布这个事件。你可以在接受到这个事件后做必要的清理的工作。
4ContextClosedEvent:当使用 ConfigurableApplicationContext 接口中的 close() 方法关闭 ApplicationContext 时,该事件被发布。一个已关闭的上下文到达生命周期末端;它不能被刷新或重启。
5RequestHandledEvent:这是一个 web-specific 事件,告诉所有 bean HTTP 请求已经被服务。

由于 Spring 的事件处理是单线程的,所以如果一个事件被发布,直至并且除非所有的接收者得到的该消息,该进程被阻塞并且流程将不会继续。因此,如果事件处理被使用,在设计应用程序时应注意。

监听上下文事件
为了监听上下文事件,一个 bean 应该实现只有一个方法 onApplicationEvent() 的 ApplicationListener 接口。

实例:

  1. 在eclipse中新建一个名为autowire的Java工程
  2. 带入spring所需要的包
  3. 在src下新建一个名为autoTest05的包,在包下新建MainTest.java,Tstudent05.java,和Tteacher05.java三个class文件
  4. 在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>

输出结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值