一、同步监听
1、定义监听事件(改监听事件需要继承ApplicationEvent)
public class EatAppleEvent extends ApplicationEvent{
private String eater;
public EatAppleEvent(Object source,String eater) {
super(source);
this.eater = eater;
}
public String getEater() {
return eater;
}
}
2、定义发布监听事件服务
@Component
public class PublishService {
@Autowired
private ApplicationEventPublisher publisher;
public void publishEatApple(){
EatAppleEvent event = new EatAppleEvent(this,"小明");
this.publisher.publishEvent(event);
System.out.println("监听吃苹果事件结束");
}
public void publishEatOrange(){
EatOrangeEvent event = new EatOrangeEvent(this,"小黄");
this.publisher.publishEvent(event);
System.out.println("监听吃橘子事件结束");
}
}
3、定义监听器
@Component
public class MyEventListener {
@EventListener
public void listenEatApple(EatAppleEvent event){
System.out.println("我监听到了"+event.getEater()+"在吃苹果");
}
@EventListener
public void listenEatOrange(EatOrangeEvent event){
System.out.println("我监听到了"+event.getEater()+"在吃橘子");
}
@EventListener({EatAppleEvent.class,EatOrangeEvent.class})
public void commonListener(){
System.out.println("我监听到了有人偷吃东西");
}
}
二、连续监听
@EventListener
public List<ApplicationEvent> listenEatApple(EatAppleEvent event){
System.out.println("我监听到了"+event.getEater()+"在吃苹果");
List<ApplicationEvent> list = new ArrayList<>();
list.add(new EatAppleEventEx(event.getSource(), event.getEater()));
list.add(new EatAppleEventExEx(event.getSource(), event.getEater()));
return list;
}
@EventListener
public void listenEatAppleEx(EatAppleEventEx event){
System.out.println(event.getEater()+"他爸发现苹果少了一个");
}
@EventListener
public void listenEatAppleExEx(EatAppleEventExEx event){
System.out.println(event.getEater()+"被他爸打了");
}
三、异步监听
@EventListener
@Async ( 貌似无效 )
public void listenEatOrange(EatOrangeEvent event){
System.out.println("我监听到了"+event.getEater()+"在吃橘子");
}
注意:不支持链式监听,可以注入 ApplicationEventPublisher 来实现链式监听
四、泛型监听 (可以监听其他对象,不只是event)
1、定义泛型监听器
public class EntityCreatedEvent<T> extends ApplicationEvent implements
ResolvableTypeProvider {
public EntityCreatedEvent(T entity) {
super(entity);
}
@Override
public ResolvableType getResolvableType() {
return ResolvableType.forClassWithGenerics(getClass(),
ResolvableType.forInstance(getSource()));
}
}
2、发布
public void publishBase(){
Dog dog = new Dog("小花");
EntityCreatedEvent<Dog> event = new EntityCreatedEvent<Dog>(dog);
this.publisher.publishEvent(event);
}
3、监听
@EventListener
public void listenBase(EntityCreatedEvent<Dog> event){
Dog dog = (Dog) event.getSource();
System.out.println("我监听到了"+dog.getName()+"在叫");
}