简介
Spring事件是为了bean与bean之间传递消息的。
一个bean处理完之后希望其余的bean接着处理,这时就需要其余的bean监听当前bean所发送的事件。
其实这就是设计模式—观察者模式的具体实现。
观察者模式
多个对象之间是存在一对多的依赖关系的,被观察的对象执行某些操作会触发通知,通知监听他的观察者对象执行某些业务逻辑。
Spring事件的使用步骤
1、先自定义事件:自定义的事件需要继承 ApplicationEvent
。
2、定义事件监听器:需要实现 ApplicationListener
。
3、使用容器对事件进行发布。
自定义事件
/**
* 自定义一个事件
*
*/
public class DemoEvent extends ApplicationEvent {
private String message;
private String email;
public DemoEvent(Object source, String message, String email) {
super(source);
this.message=message;
this.email=email;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
定义事件监听器
import org.springframework.context.ApplicationListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
/**
* 定义一个事件监听类
*
*/
@Component
public class DemoEventListener implements ApplicationListener<DemoEvent>{
//使用注解@Async支持 这样不仅可以支持通过调用,也支持异步调用,非常的灵活,
@Async
@Override
public void onApplicationEvent(DemoEvent event) {
System.out.println("注册成功,发送确认邮件为:" + event.getEmail()+",消息摘要为:"+event.getMsg());
}
}
使用容器对事件进行发布
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
/**
* 事件发布类
*
*/
@Component
public class DemoEventPublisher {
@Autowired
private ApplicationContext applicationContext;
public void pushlish(String message, String mail){
applicationContext.publishEvent(new DemoEvent(this, message, mail));
}
}
测试
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.foreveross.service.weixin.test.springevent")
public class EventConfig {
}
package com.foreveross.service.weixin.test.springevent;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* 事件测试类
*
*/
public class EventTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(EventConfig.class);
DemoEventPublisher demoEventPublisher=context.getBean(DemoEventPublisher.class);
demoEventPublisher.pushlish("张三1","565792147@qq.com");
demoEventPublisher.pushlish("张三2","565792147@qq.com");
demoEventPublisher.pushlish("张三3","565792147@qq.com");
demoEventPublisher.pushlish("张三4","565792147@qq.com");
demoEventPublisher.pushlish("张三5","565792147@qq.com");
context.close();
}
}