spring中的事件处理——迹忆客-ag捕鱼王app官网
我们在所有章节中都可以看到,spring 的核心是 applicationcontext,它管理 bean 的完整生命周期。 applicationcontext 在加载 bean 时发布某些类型的事件。 例如,contextstartedevent 在上下文启动时发布,contextstoppedevent 在上下文停止时发布。
applicationcontext 中的事件处理是通过 applicationevent 类和 applicationlistener 接口提供的。 因此,如果一个 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 的事件,告诉所有 bean 一个 http 请求已得到服务。 |
spring 的事件处理是单线程的,因此如果发布了一个事件,除非所有接收者都收到消息,否则进程会被阻塞并且流程将不会继续。 因此,如果要使用事件处理,在设计应用程序时应该小心。
监听上下文事件
要监听上下文事件,bean 应该实现 applicationlistener 接口,该接口只有一个方法 onapplicationevent()。 所以让我们写一个例子来看看事件是如何传播的,以及如何让我们的代码根据某些事件来完成所需的任务。
在 com.jiyik 包下创建 java 类 helloworld、cstarteventhandler、cstopeventhandler 和 mainapp。
这是 helloworld.java 文件的内容
helloworld.javapackage com.jiyik; public class helloworld { private string message; public void setmessage(string message){ this.message = message; } public void getmessage(){ system.out.println("your message : " message); } }
以下是 cstarteventhandler.java 文件的内容
cstarteventhandler.javapackage com.jiyik; import org.springframework.context.applicationlistener; import org.springframework.context.event.contextstartedevent; public class cstarteventhandler implements applicationlistener{ public void onapplicationevent(contextstartedevent event) { system.out.println("contextstartedevent received"); } }
以下是 cstopeventhandler.java 文件的内容
cstopeventhandler.javapackage com.jiyik; import org.springframework.context.applicationlistener; import org.springframework.context.event.contextstoppedevent; public class cstopeventhandler implements applicationlistener{ public void onapplicationevent(contextstoppedevent event) { system.out.println("contextstoppedevent received"); } }
以下是 mainapp.java 文件的内容
mainapp.javapackage com.jiyik; import org.springframework.context.configurableapplicationcontext; import org.springframework.context.support.classpathxmlapplicationcontext; public class mainapp { public static void main(string[] args) { configurableapplicationcontext context = new classpathxmlapplicationcontext("beans.xml"); // 让我们创建一个开始事件。 context.start(); helloworld obj = (helloworld) context.getbean("helloworld"); obj.getmessage(); // 让我们发布一个停止事件。 context.stop(); } }
以下是配置文件beans.xml
beans.xml
完成源代码和 bean 配置文件后,让我们运行应用程序。 如果应用程序一切正常,它将打印以下消息
contextstartedevent received
your message : hello world!
contextstoppedevent received
我们也可以发布自己的自定义事件,稍后可以捕获这些事件从而针对这些自定义事件采取任何行动。 如果对编写自己的自定义事件感兴趣,可以查看 spring 中的自定义事件。