Spring 事件机制

Spring 

事件机制的主要成员:  

  1. 事件(继承自ApplicationEvent)
  2. 事件监听器(两种方式,一种继承自接口ApplicationListener, 另一种是使用@Listener注解)
  3. 事件源(发布事件)【两种方式,一是使用ApplicationEventPublisher,二是使用ApplicatonContext(其后台)】

Demo:

用户定义,自定义事件定义

@Data
public class User {
    private Long id;

    private String name;

    public User(Long id, String name) {
        this.id = id;
        this.name = name;
    }
}

//user event
public class UserAddedEvent extends ApplicationEvent {
    public UserAddedEvent(Object source) {
        super(source);
    }
}

 

//两种发布消息方式

@Service("eventUserService")
public class UserService implements ApplicationContextAware, ApplicationEventPublisherAware {

    private ApplicationContext applicationContext;
    private ApplicationEventPublisher applicationEventPublisher;

    //使用 ApplicationContext 发布消息
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    //使用 ApplicationEventPublisher 发布消息
    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.applicationEventPublisher = applicationEventPublisher;
    }

    public String addUser(User user) {
        // 保存用户
        user.setId(1L);
        user.setName("name-1");
        // 发生事件(发邮件、发短信、、、)
//        applicationContext.publishEvent(new UserAddedEvent(user));
        // 两种发生方式一致
        applicationEventPublisher.publishEvent(new UserAddedEvent(user));
        return "ok";
    }
}

 

 

//两种监视器

//1. 实现 接口ApplicationListener

@Component
public class NotifySelfListenr implements ApplicationListener<UserAddedEvent> {

    @Override
    public void onApplicationEvent(UserAddedEvent userAddedEvent) {
        //根据类型匹配,
        // 只监视UserAddedEvent 事件
        System.out.println("self event " + userAddedEvent.getClass().toString());
    }
}


///全局监视
@Component
public class GlobalNotifyListenr implements ApplicationListener {

    @Override
    public void onApplicationEvent(ApplicationEvent event) {

        //监听所有事件,全局事件
        System.out.println("GlobalNotifyListenr  " + event.getClass().toString());

    }

}

 

 

//2.实现用注解 @EventListener

 

@Component
public class UserListener {

    @EventListener
    public void getUserEvent(UserAddedEvent userEvent) {
        System.out.println("getUserEvent-接受到事件:" + userEvent);
    }

    @EventListener
    public void getUserEvent2(UserAddedEvent userEvent) {
        System.out.println("getUserEvent2-接受到事件:" + userEvent);
    }
}

 

 

//运行代码

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {

     ConfigurableApplicationContext context= SpringApplication.run(DemoApplication.class, args);

        UserService userService = (UserService) context.getBean("eventUserService");
        userService.addUser(new User((long) 11,"abc"));
    }

}

 

 

//结果:

GlobalNotifyListenr class org.springframework.context.event.ContextRefreshedEvent
GlobalNotifyListenr class org.springframework.boot.context.event.ApplicationStartedEvent
GlobalNotifyListenr class org.springframework.boot.context.event.ApplicationReadyEvent
getUserEvent-接受到事件:com.feilong.com.demo.UserAddedEvent[source=User(id=1, name=name-1)]
getUserEvent2-接受到事件:com.feilong.com.demo.UserAddedEvent[source=User(id=1, name=name-1)]
GlobalNotifyListenr class com.feilong.com.demo.UserAddedEvent
self event class com.feilong.com.demo.UserAddedEvent
GlobalNotifyListenr class org.springframework.context.event.ContextClosedEvent

 

 

 @EventListener 原理

@EventListener注解的自定义名称的方法,会在EventListenerMethodProcessor中的afterSingletonsInstantiated()方法中遍历所有 ApplicationContext容器的单利bean。将所有添加了@EventListener的方法注入到ApplicationContext的applicationListeners和初始化的SimpleApplicationEventMulticaster的defaultRetriever.applicationListeners中,在发送事件时候获取监听列表时用。
————————————————

参考博客:https://blog.csdn.net/it_lihongmin/article/details/102940643 等

posted @ 2020-03-01 22:58  龘人上天  阅读(271)  评论(0编辑  收藏  举报