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;
}
运行结果如下