目录
· 一个事件多个处理方式的场景。
· 当用户下单成功后会发送手机短信、邮箱、微信、等。
ApplicationContext中事件处理是由ApplicationEvent类和ApplicationListener接口来提供的。如果一个Bean实现了ApplicationListener接口,并且已经发布到容器中去,每次ApplicationContext发布一个ApplicationEvent事件,这个Bean就会接到通知。Spring事件机制是观察者模式的实现。
Spring中的事件机制涉及到者几个类文件 :
ApplicationListener 监听者(事件监听)接口
ApplicationEventPublisherAware 发布者(事件发布类)接口
ApplicationEvent 事件类型(定义事件的数据结构)类

就是定义事件的数据结构。
- /**
- * 定义事件类型(定义事件的数据结构)
- */
- public class UserRegisterEvent extends ApplicationEvent {
- /** 用户名 */
- private String username;
-
- public UserRegisterEvent(Object source) {
- super(source);
- }
-
- public UserRegisterEvent(Object source, String username) {
- super(source);
- this.username = username;
- }
-
- public String getUsername() {
- return username;
- }
- }
- /**
- * 监听者 - 短信监听(异步执行)
- */
- @Component
- public class SmsListener implements ApplicationListener
{ -
- @Override
- @Async //异步
- public void onApplicationEvent(UserRegisterEvent event) {
- System.out.println(Thread.currentThread() + ",短信监听到>>>" + event.getUsername()+ "," + event.getSource());
- }
- }
- @Component
- public class EmailListener implements ApplicationListener
{ -
- private static final Logger logger = Logger.getLogger(EmailListener.class);
-
- @Override
- @Async
- public void onApplicationEvent(OrderEvent event) {
- System.out.println(Thread.currentThread() + ",邮件监听到>>>" + event.getMessage()+ "," + event.getSource());
- }
- }
- /**
- * 发布者
- */
- @Service
- public class UserServicePublisher implements ApplicationEventPublisherAware {
-
- private ApplicationEventPublisher applicationEventPublisher;
-
- @Override
- public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
- this.applicationEventPublisher = applicationEventPublisher;
- }
-
- /**
- * 发布
- */
- public void register(String username) {
- System.out.println("发布 >>>>>> "+ username);
- applicationEventPublisher.publishEvent(new UserRegisterEvent(this, username));
- }
-
- }
最后在启动类上加上开启异步注解 @EnableAsync,否则监听者将会串行执行。
- @RestController
- public class TestController {
-
- @Autowired
- private UserServicePublisher userService;
-
- @RequestMapping("/test/register")
- public void testRegister(){
- userService.register("王明");
- }
-
- }
请求:http://127.0.0.1:8080/test/register 然后查看控制台打印: