spring的事件監(jiān)聽機(jī)制解耦

    @Override
    public void audit(RealAuth realAuth) {
        RealAuth old=realauthMapper.selectByPrimaryKey(realAuth.getId());
        Userinfo applier=userinfoService.get(old.getApplier().getId());
        if(old!=null && RealAuth.STATE_NORMAL==old.getState()) {
            if(!applier.getIsRealAuth() && realAuth.getId().equals(applier.getRealAuthId())) {
                old.setRemark(realAuth.getRemark());
                old.setAuditor(UserContext.getCurrent());
                old.setAuditTime(new Date());
                old.setState(realAuth.getState());
                realauthMapper.updateByPrimaryKey(old);
                if(RealAuth.STATE_AUDIT==realAuth.getState()) {
                    // 修改成功實(shí)名認(rèn)證成功
                    applier.addState(BitStatesUtils.OP_REAL_AUTH);
                    // 實(shí)名認(rèn)證成功后,發(fā)送短信
                    
                    // 實(shí)名認(rèn)證成功后,發(fā)送郵件
                    
                    
                }else {
                    applier.setRealAuthId(null);
                }
                userinfoService.update(applier);
                
            }
        }
        
    }

上面的代碼,需要在實(shí)名認(rèn)證成功后發(fā)送短信和郵件。但這些事情并不屬于實(shí)名認(rèn)證的事情,而且后續(xù)需求可能更改,不止需要發(fā)短信和郵件可能還要做一些別的事情,一旦需求更改,這里的代碼也要更改。所以盡量將實(shí)名認(rèn)證后需要做的事情和實(shí)名認(rèn)證本身解耦

利用spring的事件監(jiān)聽

1、創(chuàng)建消息對象

@Getter
public class RealAuthSuccessEvent extends ApplicationEvent {

    private RealAuth realAuth;

    public RealAuthSuccessEvent(Object source, RealAuth realAuth) {
        super(source);
        this.realAuth = realAuth;
    }

}

2、創(chuàng)建監(jiān)聽器

@Service
public class SmsServiceImpl implements ISmsService ,ApplicationListener<RealAuthSuccessEvent>{

    @Override
    public void onApplicationEvent(RealAuthSuccessEvent event) {
        this.realAuthSendSms(event.getRealAuth());
    }
    
    private void realAuthSendSms(RealAuth realAuth) {
        System.out.println(realAuth.getApplier().getUsername()+"實(shí)名認(rèn)證成功");
    }
}

3、發(fā)布消息

@Autowired
private ApplicationContext ctx;

@Override
    public void audit(RealAuth realAuth) {
        RealAuth old=realauthMapper.selectByPrimaryKey(realAuth.getId());
        Userinfo applier=userinfoService.get(old.getApplier().getId());
        if(old!=null && RealAuth.STATE_NORMAL==old.getState()) {
            if(!applier.getIsRealAuth() && realAuth.getId().equals(applier.getRealAuthId())) {
                old.setRemark(realAuth.getRemark());
                old.setAuditor(UserContext.getCurrent());
                old.setAuditTime(new Date());
                old.setState(realAuth.getState());
                realauthMapper.updateByPrimaryKey(old);
                if(RealAuth.STATE_AUDIT==realAuth.getState()) {
                    // 修改成功實(shí)名認(rèn)證成功
                    applier.addState(BitStatesUtils.OP_REAL_AUTH);
                    // 實(shí)名認(rèn)證成功后,發(fā)布消息
                    ctx.publishEvent(new RealAuthSuccessEvent(this, realAuth));
                    
                    
                }else {
                    applier.setRealAuthId(null);
                }
                userinfoService.update(applier);
                
            }
        }
        
    }

4、如果需要監(jiān)聽多個(gè)消息對象

@Service
public class SmsServiceImpl implements ISmsService ,ApplicationListener<ApplicationEvent>{

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if(event instanceof RealAuthSuccessEvent) {
            RealAuthSuccessEvent e = (RealAuthSuccessEvent) event;
            this.realAuthSendSms(e.getRealAuth());
        }
        
    }
    
    private void realAuthSendSms(RealAuth realAuth) {
        System.out.println(realAuth.getApplier().getUsername()+"實(shí)名認(rèn)證成功");
    }
}
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容