概述:
spring中的事件机制涉及到者几个类文件 :ApplicationEvent(事件类型)、ApplicationListener(事件监听类)、ApplicationEventPublisher(事件发布类)。
ApplicationEvent:继承jdk Utill包中的 EventObject。
ApplicationListener :接口继承了utill 包中的EventListener接口,泛型参数E必须继承ApplicationEvent类。
ApplicationEventPublisher: 事件发布接口 ,实现类很多,其中子类ApplicationContext,发布事件就用ApplicationContext类去发布。
举例:
在实际开发中,有一个这样的例子,当下单成功后会发送手机短信、发送绑定邮箱、微信、等
示例代码:
pom文件
1 <parent> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-parent</artifactId> 4 <version>1.5.9.RELEASE</version> 5 </parent> 6 <dependencies> 7 <dependency> 8 <groupId>org.springframework.boot</groupId> 9 <artifactId>spring-boot-starter-web</artifactId> 10 </dependency> 11 <dependency> 12 <groupId>org.springframework.boot</groupId> 13 <artifactId>spring-boot-starter-test</artifactId> 14 <scope>test</scope> 15 </dependency> 16 </dependencies>
定义事件:
1 /**
2 * 定义订单事件
3 */
4 public class OrderEvent extends ApplicationEvent {
5
6 private String message;
7
8 /**
9 * Create a new ApplicationEvent.
10 *
11 * @param source the object on which the event initially occurred (never {@code null})
12 */
13 public OrderEvent(Object source, String message) {
14 super(source); //强制调用
15 this.message = message;
16 }
17
18 @Override
19 public Object getSource() {
20 return super.getSource();
21 }
22
23 public String getMessage() {
24 return message;
25 }
26
27 public void setMessage(String message) {
28 this.message = message;
29 }
30 }
短信监听:
1 /**
2 * 短信监听(异步执行)
3 */
4 @Component
5 public class SmsListener implements ApplicationListener<OrderEvent> {
6
7
8 private static final Logger logger = Logger.getLogger(SmsListener.class);
9
10 @Override
11 @Async //异步
12 public void onApplicationEvent(OrderEvent event) {
13 System.out.println(Thread.currentThread() + "...短信监听到..." + event.getMessage()+ "......" + event.getSource());
14 }
15 }
邮件监听:
1 /**
2 * @Author zechuang
3 * @Date 2019/8/21
4 */
5 @Component
6 public class EmailListener implements ApplicationListener<OrderEvent> {
7
8 private static final Logger logger = Logger.getLogger(EmailListener.class);
9
10 @Override
11 @Async
12 public void onApplicationEvent(OrderEvent event) {
13 System.out.println(Thread.currentThread() + "...邮件监听到..." + event.getMessage()+ "......" + event.getSource());
14 }
15 }
springBoot启动类
1 @SpringBootApplication
2 @EnableAsync //开启异步
3 public class MySpringBootApplication {
4
5 public static void main(String[] args) {
6 SpringApplication.run(MySpringBootApplication.class, args);
7 }
8 }
测试:
1 @RunWith(SpringRunner.class)
2 @SpringBootTest(classes = MySpringBootApplication.class)
3 public class ObserverTest {
4
5 @Autowired
6 private ApplicationContext applicationContext;
7
8 @Test
9 public void test01(){
10 OrderEvent order = new OrderEvent(this, "用户下单成功");
11 applicationContext.publishEvent(order);
12 System.out.println("....................over........................");
13 }
14 }
测试结果:
....................over........................ Thread[SimpleAsyncTaskExecutor-1,5,main]...邮件监听到...用户下单成功......com.test.ObserverTest@19dd04d Thread[SimpleAsyncTaskExecutor-2,5,main]...短信监听到...用户下单成功......com.test.ObserverTest@19dd04d