SpringEvent 自定义事件链,实用性很强的一种设计,可以利用它来做业务剥离,复杂场景解耦、代码独立等,也是事件驱动模型的核心,并且可以处理1对多,点对点,发布订阅的场景。
下面Demo是用4个Class来实现的:
1.ApplicationEventModel //创建上下文业务实体类,用来传递消息
2.ApplicationSendEventService //发送事件的接口,用来传递消息
3.ApplicationListenerEventService //监听事件,消费数据接口
4.ApplicationRunMain //注入spring服务 ,测试类
/**
* 接收上下文业务对象,继承ApplicationEvent对象,而继承ApplicationEvent对象最终是继承JDK里的EventObject事件类
* jdk中有observer观察者,java中的Event其实就是observer中的一个特例。
*/
public class ApplicationEventModel extends ApplicationEvent {
private String businessMessage;
/**
* 构造一个原型事件
*
* @param source 来源事件最初发生的对象
* @param businessMessage 来源事件要传递的内容
*/
public ApplicationEventModel(Object source, String businessMessage) {
super(source);
this.businessMessage = businessMessage;
}
public String getBusinessMessage() {
return businessMessage;
}
}
/**
* 具体的业务实现类,发送事件
*/
@Component
@Slf4j
public class ApplicationSendEventService {
/**
* 发布事件
* 将该事件发送给对应的监听者
*/
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
/**
* A交易接口
*/
public void tradeAtype(String message) {
log.info("第一步:生成A交易数据:{}....", message);
log.info("###通知交易信息....");
applicationEventPublisher.publishEvent(new ApplicationEventModel(this, message));
}
/**
* B交易接口
*/
public void tradeBtype(String message) {
log.info("第一步:生成B交易数据:{}....", message);
log.info("###通知交易信息....");
applicationEventPublisher.publishEvent(new ApplicationEventModel(this, message));
}
}
/**
* 监听事件类
*/
@Component
@Slf4j
public class ApplicationListenerEventService implements ApplicationListener<ApplicationEventModel> {
@Override
public void onApplicationEvent(ApplicationEventModel applicationEventModel) {
log.info("监听到消息:{}", applicationEventModel.getBusinessMessage());
}
}
@Slf4j
public class ApplicationRunMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.register(ApplicationSendEventService.class, ApplicationListenerEventService.class);
applicationContext.refresh();
ApplicationSendEventService sendEventService = applicationContext.getBean(ApplicationSendEventService.class);
sendEventService.tradeAtype("A交易数据信息!");
log.info("########################################################################");
log.info("########################################################################");
sendEventService.tradeBtype("B交易数据信息!");
}
}
打印日志
2019-02-27 15:54:14.717 INFO --- [ main] c.b.m.w.c.ApplicationSendEventService : 第一步:生成A交易数据:A交易数据信息!....
2019-02-27 15:54:14.718 INFO --- [ main] c.b.m.w.c.ApplicationSendEventService : ###通知交易信息....
2019-02-27 15:54:14.719 INFO --- [ main] .b.m.w.c.ApplicationListenerEventService : 监听到消息:A交易数据信息!
2019-02-27 15:54:14.719 INFO --- [ main] c.b.m.web.config.ApplicationRunMain : ########################################################################
2019-02-27 15:54:14.719 INFO --- [ main] c.b.m.web.config.ApplicationRunMain : ########################################################################
2019-02-27 15:54:14.720 INFO --- [ main] c.b.m.w.c.ApplicationSendEventService : 第一步:生成B交易数据:B交易数据信息!....
2019-02-27 15:54:14.720 INFO --- [ main] c.b.m.w.c.ApplicationSendEventService : ###通知交易信息....
2019-02-27 15:54:14.720 INFO --- [ main] .b.m.w.c.ApplicationListenerEventService : 监听到消息:B交易数据信息!