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

相關文章
相關標籤/搜索