做用:解耦目標對象和它的依賴對象java
事件:ApplicationEventweb
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();
------------------------------------------------------------------------------
public class ContentEvent extends ApplicationEvent {
public ContentEvent(final String content) {
super(content);
}
}
@Component //使用@Compoent註冊Bean
public class LisiListener implements ApplicationListener<ContentEvent> {
public void onApplicationEvent(final ContentEvent event) {
System.out.println("李四收到了新的內容:" + event.getSource());
}
}
@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