Spring
监听器demo
使用场景
新增A业务的时候,需要①发短信②子业务同步数据③…
出现问题:业务耦合
实现方案:使用spring监听器解耦
低版本spring,没有 @EventListener
注解
先创建新增成功事件
public class ACreateSuccessEvent extends ApplicationEvent {
public ACreateSuccessEvent(Object source) {
super(source);
}
}
A业务新增成功后发布事件
public class AserviceImpl implements Aservice {
@Autowired
private ApplicationContext applicationContext;
@Override
public save(){
A a = new A();
save(a);
// 发布事件,此处(a)传什么值都可以,实现的时候给转一下
applicationContext.publishEvent(new EmergencyProjectCreateEvent(a));
}
}
需要执行操作的①②③…等等业务只需要实现
ApplicationListener
即可
public class SmsServiceImpl implements SmsService,ApplicationListener<ACreateSuccessEvent> {
@Override
public void onApplicationEvent(ACreateSuccessEvent successEvent) {
Object source = successEvent.getSource();
if (source != null && source.getClass().isAssignableFrom(A.class)) {
A a = (A) source;
// 执行自己的业务
}
}
}
spring高一点的版本,有 @EventListener
注解,可以写的更简单些
先创建新增成功事件,此处还是一样
public class ACreateSuccessEvent extends ApplicationEvent {
public ACreateSuccessEvent(Object source) {
super(source);
}
}
A业务新增成功后发布事件,此处一样
public class AserviceImpl implements Aservice {
@Autowired
private ApplicationContext applicationContext;
@Override
public save(){
A a = new A();
save(a);
// 发布事件,此处(a)传什么值都可以,实现的时候给转一下
applicationContext.publishEvent(new EmergencyProjectCreateEvent(a));
}
}
需要执行操作的①②③…等等业务只需要实现
ApplicationListener
即可,此处不同
// public class SmsServiceImpl implements SmsService,ApplicationListener<ACreateSuccessEvent> {
public class SmsServiceImpl implements SmsService {
// @Override
// 加上注解,根据参数匹配
@EventListener
public void onApplicationEvent(ACreateSuccessEvent successEvent) {
Object source = successEvent.getSource();
if (source != null && source.getClass().isAssignableFrom(A.class)) {
A a = (A) source;
// 执行自己的业务
}
}
}