Springboot---ApplicationListenerとApplicationEventをリスニングして簡単に使用


ApplicationListenerとApplicationEventをリスニングして簡単に使用
本来実現したい機能は、ログインに成功した後、一部のユーザーの情報をセッションに入れて、ログインインタフェースがコールバックに成功した後、書いていると思っていたが、リスニングの動作をして、ログインに成功したインタフェースをリスニングして、その後、リスニング関数の中に入って、業務処理を行いたいと思っていた.
1、まずリスニングクラスを書いて、それからApplicationListenerインタフェースを実現して、その中のpublic void onApplicationEvent(ApplicationEvent event)方法を実現して、実はApplicationListenerインタフェースは汎用型を使うことができて、しかし私は後でリスニングがあることを防止するために、私は汎用型を書くのではなく、onApplicationEvent方法の中でinstanceofという判断を書きました.主に傍受するイベントがあなたが傍受するイベントかどうかを判断します.
package cn.springboot.yzpt.listener;

import cn.springboot.yzpt.common.SuccessfulAuthenticationEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

public class SuccessLoginListener implements ApplicationListener {

    private static Logger logger = LoggerFactory.getLogger(SuccessLoginListener.class);

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if(event instanceof SuccessfulAuthenticationEvent){

            SuccessfulAuthenticationEvent successfulAuthenticationEvent = (SuccessfulAuthenticationEvent)event;

            logger.info(successfulAuthenticationEvent.toString());
        }
    }

}

2、次にリスニングイベントを作成する必要があります.ApplicationEventというクラスを継承する必要があります.この中に必要な属性は、自分で定義します.私はHttpServeretRequest httpServeretRequestを定義します.HttpServletResponse httpServletResponse; String sessionId、この3つの属性は、私のビジネスニーズを満たすために使用されます.
package cn.springboot.yzpt.common;

import org.springframework.context.ApplicationEvent;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class SuccessfulAuthenticationEvent extends ApplicationEvent {

    private static final long serialVersionUID = 3039313222160544111L;

    private HttpServletRequest httpServletRequest;
    private HttpServletResponse httpServletResponse;
    private String sessionId;

    public SuccessfulAuthenticationEvent(Object source,HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) {
        super(source);
        this.httpServletRequest = httpServletRequest;
        this.httpServletResponse = httpServletResponse;
    }


    public String getSessionId() {
        return sessionId;
    }

    public void setSessionId(String sessionId) {
        this.sessionId = sessionId;
    }

    public HttpServletResponse getHttpServletResponse() {
        return httpServletResponse;
    }

    public void setHttpServletResponse(HttpServletResponse httpServletResponse) {
        this.httpServletResponse = httpServletResponse;
    }

    public HttpServletRequest getHttpServletRequest() {
        return httpServletRequest;
    }

    public void setHttpServletRequest(HttpServletRequest httpServletRequest) {
        this.httpServletRequest = httpServletRequest;
    }
}

3、次にspringbootの起動クラスにリスニングを配置する必要があります.
package cn.springboot.yzpt;

import cn.springboot.yzpt.listener.SuccessLoginListener;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
@MapperScan("cn.springboot.yzpt.mapper")
public class YzptApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(YzptApplication.class, args);
        //    
        context.addApplicationListener(new SuccessLoginListener());
    }
}

4、このとき、このイベントをトリガーする方法を設定する必要があります.
package cn.springboot.yzpt.common;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class EventPublisher {

    @Autowired
    private ApplicationContext applicationContext;

    public void pushlish(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){
        applicationContext.publishEvent(new SuccessfulAuthenticationEvent(this,httpServletRequest,httpServletResponse));
    }
}

5、最後に自分のビジネスロジックの中でこのトリガを呼び出す方法で、ログイン成功の中でこのトリガのイベントを書いて、このインタフェースの後のビジネスロジックを処理します.
package cn.springboot.yzpt.controller.loginUser;

import cn.springboot.yzpt.common.CodeEnums;
import cn.springboot.yzpt.common.EventPublisher;
import cn.springboot.yzpt.common.HttpRequestEntity;
import cn.springboot.yzpt.exception.YzptException;
import cn.springboot.yzpt.server.loginUser.LoginUserServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

@RestController
@RequestMapping("/loginUser")
public class LoginUserController {

    private static Logger logger = LoggerFactory.getLogger(LoginUserController.class);

    @Autowired
    LoginUserServer loginUserServer;

    @Autowired
    EventPublisher eventPublisher;

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    @ResponseBody
    public HttpRequestEntity login(@RequestBody Map userInfo, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
        HttpRequestEntity httpRequestEntity = new HttpRequestEntity();
        try {
            boolean loginType = loginUserServer.login(userInfo.get("user"), userInfo.get("password"));
            httpServletRequest.getSession().setAttribute("id", "12314434231");
            if (loginType) {
                httpRequestEntity.setMessage("    ");


                eventPublisher.pushlish(httpServletRequest,httpServletResponse);

                logger.info(userInfo.get("user") + "    ");
            }
        } catch (YzptException e) {
            httpRequestEntity.setCode(e.getCode());
            httpRequestEntity.setMessage(e.getErrMsg());
        } catch (Exception e) {
            logger.error("/loginUser/login:    ", e);
            httpRequestEntity.setCodeEnums(CodeEnums.SYSTEM_ERR);
        }
        return httpRequestEntity;
    }
}