做用:解耦目标对象和它的依赖对象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