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<MyEvent> {
    @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,"reed@ustc.com","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;
    }

运行结果如下

全部评论

相关推荐

在评审的大师兄很完美:像这种一般就是部门不匹配 转移至其他部门然后挂掉 我就是这样被挂了
点赞 评论 收藏
分享
10-28 11:04
已编辑
美团_后端实习生(实习员工)
一个2人:我说几个点吧,你的实习经历写的让人觉得毫无含金量,你没有挖掘你需求里的 亮点, 让人觉得你不仅打杂还摆烂。然后你的简历太长了🤣你这个实习经历看完,估计没几个人愿意接着看下去, sdk, 索引这种东西单拎出来说太顶真了兄弟,好好优化下简历吧
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务