spring监听器的使用

       在实际项目中,我们往往需要自定义一些事件和监听器来满足业务场景,比如在微服务中会有这样的场景:微服务 A 在处理完某个逻辑之后,需要通知微服务 B 去处理另一个逻辑,或者微服务 A 处理完某个逻辑之后,需要将数据同步到微服务 B。这种场景非常普遍,这时我们可以自定义事件以及监听器来监听,一旦监听到微服务 A 中的某事件发生,就去通知微服务 B 处理对应的逻辑。

1 自定义事件

自定义事件需要继承 ApplicationEvent 对象,在事件中定义一个 User 对象来模拟数据,构造方法中将 User 对象传进来初始化。如下:

public class MyEvent extends ApplicationEvent {
    private User user;
    public MyEvent(Object source,User user) {
        super(source);
        this.user = user;

    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

2 自定义监听器

接下来,自定义一个监听器来监听上面定义的 MyEvent 事件,自定义监听器实现 ApplicationListener 接口即可。如下:

@Component
public class MyEventListener implements ApplicationListener {
    @Override
    public void onApplicationEvent(MyEvent myEvent) {
        // 把事件中的信息获取到
        User user = myEvent.getUser();
        // 处理事件,实际项目中可以通知别的微服务或者处理其他逻辑等
        System.out.println("用户名:" + user.getEmail());
        System.out.println("密码:" + user.getPassword());
    }
}

然后重写 onApplicationEvent 方法,将自定义的 MyEvent 事件传进来,因为该事件中,我们定义了 User 对象(该对象在实际中就是需要处理的数据,在下文来模拟),然后就可以使用该对象的信息了。

或者通过注解的方式监听

@Component
public class MyEventListener {
    @EventListener({MyEvent.class})
    public void onApplicationEvent(MyEvent myEvent) {
        // 把事件中的信息获取到
        User user = myEvent.getUser();
        // 处理事件,实际项目中可以通知别的微服务或者处理其他逻辑等
        System.out.println("用户名:" + user.getEmail());
        System.out.println("密码:" + user.getPassword());
   

OK,定义好了事件和监听器之后,需要手动发布事件,这样监听器才能监听到,这需要根据实际业务场景来触发,本文写个触发逻辑,如下:
 

@Autowired
    private ApplicationContext applicationContext;

    @Override
    public User getUser2() {
        User user = new User(100,"[email protected]","nicai");
        MyEvent event = new MyEvent(this,user);
        applicationContext.publishEvent(event);
        return user;
    }

在 Service 中注入 ApplicationContext,在业务代码处理完之后,通过 ApplicationContext 对象手动发布 MyEvent 事件,这样我们自定义的监听器就能监听到,然后处理监听器中写好的业务逻辑。

最后,在 Controller 中写一个接口来测试一下:
 

 @RequestMapping("/publish")
    public User getUser(){
        User user = userService.getUser2();
        return user;
    }

运行结果如下

spring监听器的使用_第1张图片

你可能感兴趣的:(spring)