拦截器中@Autowired注入失效,获取service解决

前言:项目中日志记录功能,登录拦截,等等拦截器实现,有时候会需要操作service业务层调用其他方法等实现,这时候直接使用@Autowired注入service,是无效的。所以需要用到如下办法解决。
通过WebApplicationContextUtils.getRequiredWebApplicationContext,获取spring的单例webcontext

private <T> T getService(Class<T> clazz,HttpServletRequest request){
BeanFactory factory=WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
return factory.getBean(clazz);
}

具体案例:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
public class LogInterceptor implements HandlerInterceptor {

    /**
     * 日志
     */
    private final Logger logger = LoggerFactory.getLogger(LogInterceptor.class);


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        OperatorLog log = null;
        HandlerMethod hardlerMethod = (HandlerMethod) handler;
        Method method = hardlerMethod.getMethod();
        try {
            //不包含Log注解的不进行日志记录
            if (method.isAnnotationPresent(Log.class)) {
                //此处是本项目使用工具类获取日志相关信息,忽略
                log = OperatorLogUtil.getLog(request, method);
                log.setOperatorResult(OperatorLogUtil.OPERATOR_RESULT_SUCCESS);
              //此处就是本项目需要将日志入库,调取service层,所以使用WebApplicationContextUtils工具类获取
                OperatorLogService operatorLogService = getService(OperatorLogService.class, request);
                operatorLogService.saveOperatorLog(log);
            }
        } catch (Exception e) {
            logger.error("[记录操作日志时失败]", e.getMessage());
        }
    }


    /**
     * 拦截器中,通过@Autowired注入失效,需要通过以下方式获取service对象
     * @param clazz  对象class类
     * @param request http request
     * @param <T>  对象类别
     * @return 返回一个对象
     */
    private <T> T getService(Class<T> clazz, HttpServletRequest request) {
        BeanFactory factory = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
        return factory.getBean(clazz);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容