Spring在启动时,事件机制怎么时候可以使用?

问题描述

希望在系统启动时,或启动后立即触发事件(即context.publishEvent(event))但在InitializingBean的afterPropertiesSet方法和BeanPostProcessor的postProcessAfterInitialization方法里触发的事件仍然无效,请问该用什么样的方式触发事件呢?问题补充:1, 实现ApplicationContextAware拿到ApplicationContext来触发事件;2, 实现ApplicationListener接口来接收事件但是在系统启动过程中,或启动后无法立即触发事件,或者说是触发事件无效。实现InitializingBean后,在afterPropertiesSet方法中触发,或在实现BeanPostProcessor后,在postProcessAfterInitialization中触发,事件都无法传递到实现ApplicationListener的Bean中,只是在系统加载完成后,事件可以正常触发(如在执行某个客户端的请求时,可以很正常地触发事件)其实我就想在系统启动完成后再通过触发事件来初始化另外一些代码。问题补充:感觉我的代码跟 小疯子 提供的代码没什么不一样,但我的事件在afterPropertiesSet里就是无法触发成功。我再试试

解决方案

public class Tigger implements InitializingBean, ApplicationContextAware {private ApplicationContext applicationContext;public void afterPropertiesSet() throws Exception {this.applicationContext.publishEvent(new TiggerEvent(new Object()));}public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}}public class TiggerEvent extends ApplicationEvent {private String name = "fuxueliang";public String getName() {return name;}public TiggerEvent(Object source) {super(source);}}public class TiggerListener implements ApplicationListener {public void onApplicationEvent(ApplicationEvent event) {if (event instanceof TiggerEvent) {TiggerEvent tiggerEvent = (TiggerEvent) event;System.out.println("+++++++++++++" + tiggerEvent.getName() + "++++++++++++++++");}}}<bean class="com.TiggerListener" /><bean class="com.Tigger" />三块代码, 一个配置, 启动的时候, 就打出了:+++++++++++++fuxueliang++++++++++++++++不知道你是怎么实现的?
解决方案二:
不知道你是怎么触发的!你可以看下Spring Reference的第3.8.3章[Events], 有详细的介绍!主要就是两点:1, 实现ApplicationContextAware拿到ApplicationContext来触发事件;2, 实现ApplicationListener接口来接收事件

时间: 2024-10-30 09:56:40

Spring在启动时,事件机制怎么时候可以使用?的相关文章

Spring中ApplicationContext的事件机制

   ApplicationContext事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext事件处理.如果容器中有一个ApplicationListener Bean,每当ApplicationContext发布ApplicationEvent时,ApplicationListener Bean将自动被触发.     Spring的事件框架有如下两个重要的成员: ApplicationE

Spring中ApplicationContext的事件机制(一 )

在Windows编程中,我们常常需要处理各类事件,比如鼠标单击事件.双击事件.在Spring中, ApplicationContext也有发布和监听时间的能力.我们知道,在windows开发中,如果要响应某个事件,我 们只需要编写相应windows消息的响应函数就可以了.比如鼠标单击事件,相应的消息就是 WM_LBUTTONDOWN .在Spring中也是一样,Spring中ApplicationEvent类及其子类就相当于Windows中的消 息,事件监听器ApplcationListener

Spring中ApplicationContext的事件机制(二 内定事件)

在Spring中已经定义了五个标准事件,分别介绍如下: 1)ContextRefreshedEvent:当ApplicationContext初始化或者刷新时触发该事件. 2)ContextClosedEvent:当ApplicationContext被关闭时触发该事件.容器被关闭时,其管理的所有 单例Bean都被销毁. 3)RequestHandleEvent:在Web应用中,当一个http请求(request)结束触发该事件. ContestStartedEvent:Spring2.5新增的

ssh-SpringMVC+Spring+Hibernate 启动tomcat时出现这个错误怎么解决

问题描述 SpringMVC+Spring+Hibernate 启动tomcat时出现这个错误怎么解决 2012-10-24 11:45:22 org.apache.catalina.core.AprLifecycleListener init 信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the

spring如何在web启动时不连接数据库,而在需要时在连接数据库?

问题描述 现在又一个应用,在web启动时不想让它连接数据库,如果在web启动时就自动出始化数据库连接,那么数据库连接出现问题就会使应用起不起来,现在就是要求能在应用中用到数据库,调用持久层数据时,在初始化数据库实例.现在有个方案不知可行吗,1.在web.xml中配置时先不让web启动就自动加载有关数据库初始化的配置文件,而是在以后需要数据库连接访问的应用时,通过获取配置文件,获得相应的bean实现.2.对applicationcontext.xml中的有关数据源的bean设置lazy-init=

jetty启动时spring老是出错

问题描述 jetty启动时spring老是出错 解决方案 怎么解决这个问题 求解????

spring mvc-SpringMVC proj启动时的问题

问题描述 SpringMVC proj启动时的问题 严重: Servlet.service() for servlet [jsp] in context with path [] threw exception [java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/JspAppli

Spring的容器内部事件发布

文/杜琪(简书作者) 原文链接:http://www.jianshu.com/p/4f0ad3bb98f0 著作权归作者所有,转载请联系作者获得授权,并标注"简书作者". 自定义事件机制 给出自定义事件类型在某些应用场景下,我们希望关注特定功能的执行情况,这种功能的开始或者结束或者异常都可以看做一个事件,因此需要定义自己的事件类型. package com.javadu.event; import java.util.EventObject; public class MethodEx

Spring4.1新特性——异步调度和事件机制的异常处理

Spring 4.1对异步调用提供了AsyncResult及SuccessCallback.FailureCallback.和异常处理的支持:对事件调度也提供了相应的异常处理器.   1.事件调度异常处理器 1.1.定义异常处理器: Java代码   public class MyErrorHandler implements ErrorHandler {       @Override       public void handleError(Throwable throwable) {