事件發(fā)布
Spring提供了兩個(gè)接口實(shí)現(xiàn)發(fā)布事件剩失,分別是:ApplicationEventPublisher和ApplicationEventMulticaster政模。
- ApplicationEventPublisher源碼:
package org.springframework.context;
@FunctionalInterface
public interface ApplicationEventPublisher {
default void publishEvent(ApplicationEvent event) {
this.publishEvent((Object)event);
}
// spring 4.2后支持發(fā)布任何對(duì)象作為事件
void publishEvent(Object var1);
}
使用ApplicationEventPublisher發(fā)布事件的實(shí)例代碼
@RestController
@RequestMapping("test/")
public class Test implements ApplicationContextAware {
//ApplicationContext 實(shí)現(xiàn)了ApplicationEventPublisher接口本橙,為了省事直接拿來(lái)用
ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@RequestMapping(value = "publishEvent",method = {RequestMethod.POST})
public Demo publishEvent(@RequestBody Demo myEvent){
applicationContext.publishEvent(myEvent);
return myEvent;
}
}
關(guān)于Aware接口:Spring提供了各種aware接口用戶獲取不同的實(shí)例较锡。
- ApplicationEventMulticaster源碼
package org.springframework.context.event;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;
public interface ApplicationEventMulticaster {
// 添加監(jiān)聽(tīng)器
void addApplicationListener(ApplicationListener<?> var1);
// 以bean的方式添加監(jiān)聽(tīng)器
void addApplicationListenerBean(String var1);
// 移除監(jiān)聽(tīng)器
void removeApplicationListener(ApplicationListener<?> var1);
// 同上
void removeApplicationListenerBean(String var1);
void removeAllListeners();
//發(fā)布事件
void multicastEvent(ApplicationEvent var1);
// ResolvableType是泛型信息
void multicastEvent(ApplicationEvent var1, @Nullable ResolvableType var2);
}
ApplicationEventMulticaster發(fā)布事件demo
@RestController
@RequestMapping("test/")
public class Test {
@Autowired
MyEventListener2 myEventListener2;
SimpleApplicationEventMulticaster simpleApplicationEventMulticaster;
@RequestMapping(value = "multicastEvent",method = {RequestMethod.POST})
public String multicastEvent(@RequestBody Demo demo){
MyEvent myEvent = new MyEvent(demo);
simpleApplicationEventMulticaster = new SimpleApplicationEventMulticaster();
simpleApplicationEventMulticaster.addApplicationListener(myEventListener2);
simpleApplicationEventMulticaster.multicastEvent(myEvent);
return "multicastEvent succeed";
}
}
事件監(jiān)聽(tīng)
- 注解方式實(shí)現(xiàn)事件監(jiān)聽(tīng)
@Component
public class MyEventListener {
@Async
@EventListener
public String onMyMessage(Demo myEvent){
System.out.println("eventListener on message:"+JSON.toJSONString(myEvent));
return "myNewEvent";
}
}
若返回值不為空則會(huì)被作為新的事件再次發(fā)布仑撞。
- 實(shí)現(xiàn)ApplicationListener接口監(jiān)聽(tīng)事件
@Component
public class MyEventListener2 implements ApplicationListener<MyEvent> {
@Override
public void onApplicationEvent(MyEvent applicationEvent) {
System.out.println("實(shí)現(xiàn)ApplicationListener方法監(jiān)聽(tīng)事件:"+applicationEvent.data);
}
}
public class MyEvent extends ApplicationEvent {
Object data;
public MyEvent(Object source) {
super(source);
this.data = source;
}
}