spring 事件驱动模型

做用:解耦目标对象和它的依赖对象java

事件,目标(发布事件者),监听器

事件:ApplicationEventweb

  • ContextStartedEvent:ApplicationContext启动后触发的事件;(目前版本没有任何做用)
  • ContextStoppedEvent:ApplicationContext中止后触发的事件;(目前版本没有任何做用)
  • ContextRefreshedEvent:ApplicationContext初始化或刷新完成后触发的事件;(容器初始化完成后调用)
  • ContextClosedEvent:ApplicationContext关闭后触发的事件;(如web容器关闭时自动会触发spring容器的关闭,若是是普通java应用,须要调用ctx.registerShutdownHook();注册虚拟机关闭时的钩子才行)

目标(发布事件者)

    ApplicationEventPublisher,ApplicationEventMulticasterspring

    经过ApplicationContext.publishEvent便可发送事件app

监听器

    ApplicationListener,在方法onApplicationEvent中完成事件处理异步

    SmartApplicationListener,该接口可方便实现去判断支持的事件类型、目标类型,及执行顺序ide

        //若是实现支持该事件类型 那么返回true  测试

        boolean supportsEventType(Class<? extends ApplicationEvent> eventType); spa

        //若是实现支持“目标”类型,那么返回true.net

        boolean supportsSourceType(Class<?> sourceType);component

        //顺序,即监听器执行的顺序,值越小优先级越高

        int getOrder();  

------------------------------------------------------------------------------

定义事件 (继承ApplicationEvent)

public class ContentEvent extends ApplicationEvent { 

    public ContentEvent(final String content) {

        super(content); 

    }

}

定义无序监听器 (实现ApplicationListener)

@Component //使用@Compoent注册Bean

public class LisiListener implements ApplicationListener<ContentEvent> { 

    @Override

    public void onApplicationEvent(final ContentEvent event) { 

        System.out.println("李四收到了新的内容:" + event.getSource()); 

    }

}

定义有序监听器 (实现SmartApplicationListener)

@Component

public class WangwuListener implements SmartApplicationListener { 

    @Override    //用于指定支持的事件类型,只有支持的才调用onApplicationEvent;

    public boolean supportsEventType(final Class<? extends ApplicationEvent> eventType) { 

        return eventType == ContentEvent.class;

    }

    @Override    //支持的目标类型,只有支持的才调用onApplicationEvent

    public boolean supportsSourceType(final Class<?> sourceType) {  

        return sourceType == String.class;  

    }

    @Override

    public void onApplicationEvent(final ApplicationEvent event) {

        System.out.println("王五在孙六以前收到新的内容:" + event.getSource());

    }

    @Override    //即顺序,越小优先级越高

    public int getOrder() { return 1; }

}

测试 

<context:component-scan base-package="com...."/>  //自动扫描注解Bean

@RunWith(SpringJUnit4ClassRunner.class) 

@ContextConfiguration(locations={"classpath:spring-config-hello.xml"})

public class HelloIT {

    @Autowired 

    private ApplicationContext applicationContext;  

    @Test

    public void testPublishEvent() {

        applicationContext.publishEvent(new ContentEvent("今年是龙年的博客更新了")); 

    }

}

 

全局异步

即只要是触发事件都是以异步执行

 

http://jinnianshilongnian.iteye.com/blog/1902886

相关文章
相关标签/搜索