简介

Spring事件是为了bean与bean之间传递消息的。
一个bean处理完之后希望其余的bean接着处理,这时就需要其余的bean监听当前bean所发送的事件。
其实这就是设计模式—观察者模式的具体实现。

观察者模式
多个对象之间是存在一对多的依赖关系的,被观察的对象执行某些操作会触发通知,通知监听他的观察者对象执行某些业务逻辑。

Spring事件的使用步骤

1、先自定义事件:自定义的事件需要继承 ApplicationEvent
2、定义事件监听器:需要实现 ApplicationListener
3、使用容器对事件进行发布。

自定义事件

  1. /**
  2. * 自定义一个事件
  3. *
  4. */
  5. public class DemoEvent extends ApplicationEvent {
  6. private String message;
  7. private String email;
  8. public DemoEvent(Object source, String message, String email) {
  9. super(source);
  10. this.message=message;
  11. this.email=email;
  12. }
  13. public String getMessage() {
  14. return message;
  15. }
  16. public void setMessage(String message) {
  17. this.message = message;
  18. }
  19. public String getEmail() {
  20. return email;
  21. }
  22. public void setEmail(String email) {
  23. this.email = email;
  24. }
  25. }

定义事件监听器

  1. import org.springframework.context.ApplicationListener;
  2. import org.springframework.scheduling.annotation.Async;
  3. import org.springframework.stereotype.Component;
  4. /**
  5. * 定义一个事件监听类
  6. *
  7. */
  8. @Component
  9. public class DemoEventListener implements ApplicationListener<DemoEvent>{
  10. //使用注解@Async支持 这样不仅可以支持通过调用,也支持异步调用,非常的灵活,
  11. @Async
  12. @Override
  13. public void onApplicationEvent(DemoEvent event) {
  14. System.out.println("注册成功,发送确认邮件为:" + event.getEmail()+",消息摘要为:"+event.getMsg());
  15. }
  16. }

使用容器对事件进行发布

  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.stereotype.Component;
  4. /**
  5. * 事件发布类
  6. *
  7. */
  8. @Component
  9. public class DemoEventPublisher {
  10. @Autowired
  11. private ApplicationContext applicationContext;
  12. public void pushlish(String message, String mail){
  13. applicationContext.publishEvent(new DemoEvent(this, message, mail));
  14. }
  15. }

测试

  1. import org.springframework.context.annotation.ComponentScan;
  2. import org.springframework.context.annotation.Configuration;
  3. @Configuration
  4. @ComponentScan("com.foreveross.service.weixin.test.springevent")
  5. public class EventConfig {
  6. }
  1. package com.foreveross.service.weixin.test.springevent;
  2. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  3. /**
  4. * 事件测试类
  5. *
  6. */
  7. public class EventTest {
  8. public static void main(String[] args) {
  9. AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(EventConfig.class);
  10. DemoEventPublisher demoEventPublisher=context.getBean(DemoEventPublisher.class);
  11. demoEventPublisher.pushlish("张三1","565792147@qq.com");
  12. demoEventPublisher.pushlish("张三2","565792147@qq.com");
  13. demoEventPublisher.pushlish("张三3","565792147@qq.com");
  14. demoEventPublisher.pushlish("张三4","565792147@qq.com");
  15. demoEventPublisher.pushlish("张三5","565792147@qq.com");
  16. context.close();
  17. }
  18. }