事件机制类似于消息队列mq,在spring中也有自己的事件机制,也就是发布订阅模式,在项目中用到的也是很多,可以让子业务与主业务解耦合。大大加强代码的可扩展性。
直接上代码,来个小demo
注册用户的时候给他发送短信,并且赠送他代金券
首先就是最基本的User类:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String name;
}
定义一个事件:
public class UserEvent extends ApplicationEvent {
/**
* userEvent为事件本身
* @param source 事件的资源,也就是User对象
*/
public UserEvent(Object source) {
super(source);
}
//为了方便就直接重写并强转了
@Override
public User getSource() {
return (User)super.getSource();
}
}
然后事件的发布者(为了方便就写在了controller中):
@RestController
@RequestMapping("register")
public class registerController {
//事件的发布者,直接用autowired注入就可以了
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
@GetMapping
public String register(){
User user = new User(1,"王");
UserEvent userEvent = new UserEvent(user);
//发布事件
applicationEventPublisher.publishEvent(userEvent);
return "success";
}
}
最后就是订阅者了:
@Component
public class UserListener {
//事件的先后顺序
@Order(1)
//监听的事件类型
@EventListener(UserEvent.class)
public void sendSSM(UserEvent event){
User user = event.getSource();
System.out.println("hello:"+user.getName());
}
@Order(2)
@EventListener(UserEvent.class)
public void give(UserEvent event){
User user = event.getSource();
System.out.println("give:"+user.getId()+" gifts");
}
}