前言:项目中日志记录功能,登录拦截,等等拦截器实现,有时候会需要操作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);
}
}