最全springmvc源码分析,javanginx面试

那么如何才能正确的掌握Redis呢?

为了让大家能够在Redis上能够加深,所以这次给大家准备了一些Redis的学习资料,还有一些大厂的面试题,包括以下这些面试题

  • 并发编程面试题汇总

  • JVM面试题汇总

  • Netty常被问到的那些面试题汇总

  • Tomcat面试题整理汇总

  • Mysql面试题汇总

  • Spring源码深度解析

  • Mybatis常见面试题汇总

  • Nginx那些面试题汇总

  • Zookeeper面试题汇总

  • RabbitMQ常见面试题汇总

JVM常频面试:

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

Mysql面试题汇总(一)

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

Mysql面试题汇总(二)

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

Redis常见面试题汇总(300+题)

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

//获取到controller在factory中的所有bean的信息

mappedHandler = this.getHandler(processedRequest);

if (mappedHandler == null) {

this.noHandlerFound(processedRequest, response);

return;

}

//获取到处理器 也就是controller类

HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());

String method = request.getMethod();

boolean isGet = “GET”.equals(method);

if (isGet || “HEAD”.equals(method)) {

// 如果是get 根据上次修改的时间戳来判断资源是否已被修改,如果资源未被修改,则直接返回,浏览器将使用缓存

long lastModified = ha.getLastModified(request, mappedHandler.getHandler());

if ((new ServletWebRequest(request, response)).checkNotModified(lastModified) && isGet) {

return;

}

}

if (!mappedHandler.applyPreHandle(processedRequest, response)) {

return;

}

mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

if (asyncManager.isConcurrentHandlingStarted()) {

return;

}

this.applyDefaultViewName(processedRequest, mv);

//后置处理器

mappedHandler.applyPostHandle(processedRequest, response, mv);

} catch (Exception var20) {

dispatchException = var20;

} catch (Throwable var21) {

dispatchException = new NestedServletException(“Handler dispatch failed”, var21);

}

this.processDispatchResult(processedRequest, response, mappedHandler, mv, (Exception)dispatchException);

} catch (Exception var22) {

this.triggerAfterCompletion(processedRequest, response, mappedHandler, var22);

} catch (Throwable var23) {

this.triggerAfterCompletion(processedRequest, response, mappedHandler, new NestedServletException(“Handler processing failed”, var23));

}

} finally {

if (asyncManager.isConcurrentHandlingStarted()) {

if (mappedHandler != null) {

mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);

}

} else if (multipartRequestParsed) {

this.cleanupMultipart(processedRequest);

}

}

}

1.getHandler方法

获取处理器映射器

@Nullable

protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {

//mapping中放着所有的mapping信息

if (this.handlerMappings != null) {

Iterator var2 = this.handlerMappings.iterator();

while(var2.hasNext()) {

HandlerMapping mapping = (HandlerMapping)var2.next();

//关键方法 获取bean信息的集合

HandlerExecutionChain handler = mapping.getHandler(request);

if (handler != null) {

return handler;

}

}

}

return null;

}

自定义的mapping都在RequestMappingHandlerMapping 。

然后进入 Object handler = this.getHandlerInternal(request);。

public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {

//主要方法

Object handler = this.getHandlerInternal(request);

if (handler == null) {

handler = this.getDefaultHandler();

}

// 如果还是没有则返回 这时候 DispatcherServlet会返回 404

if (handler == null) {

return null;

} else {

// 如果返回的处理器是字符串 则认为它是一个beanName

if (handler instanceof String) {

String handlerName = (String)handler;

// 通过beanName从IOC容器中获取相应的处理器

handler = this.obtainApplicationContext().getBean(handlerName);

}

// 下面是将处理器 和 拦截器封装成处理器执行链

HandlerExecutionChain executionChain = this.getHandlerExecutionChain(handler, request);

if (this.logger.isTraceEnabled()) {

this.logger.trace("Mapped to " + handler);

} else if (this.logger.isDebugEnabled() && !request.getDispatcherType().equals(DispatcherType.ASYNC)) {

this.logger.debug("Mapped to " + executionChain.getHandler());

}

if (CorsUtils.isCorsRequest(request)) {

CorsConfiguration globalConfig = this.corsConfigurationSource.getCorsConfiguration(request);

CorsConfiguration handlerConfig = this.getCorsConfiguration(handler, request);

CorsConfiguration config = globalConfig != null ? globalConfig.combine(handlerConfig) : handlerConfig;

executionChain = this.getCorsHandlerExecutionChain(request, executionChain, config);

}

// 返回处理器执行链

return executionChain;

}

}

之后再进入getHandlerInternal。

protected HandlerMethod getHandlerInternal(HttpServletRequest request) throws Exception {

//请求的路径

String lookupPath = this.getUrlPathHelper().getLookupPathForRequest(request);

this.mappingRegistry.acquireReadLock();

HandlerMethod var4;

try {

//主要方法

HandlerMethod handlerMethod = this.lookupHandlerMethod(lookupPath, request);

var4 = handlerMethod != null ? handlerMethod.createWithResolvedBean() : null;

} finally {

this.mappingRegistry.releaseReadLock();

}

return var4;

}

之后再HandlerMethod handlerMethod = this.lookupHandlerMethod(lookupPath, request); 在类中 通过request中的mapping在this.mappingRegistry中获取这个bean的所有信息。

@Nullable

protected HandlerMethod lookupHandlerMethod(String lookupPath, HttpServletRequest request) throws Exception {

List<AbstractHandlerMethodMapping.Match> matches = new ArrayList();

List directPathMatches = this.mappingRegistry.getMappingsByUrl(lookupPath);

if (directPathMatches != null) {

this.addMatchingMappings(directPathMatches, matches, request);

}

if (matches.isEmpty()) {

this.addMatchingMappings(this.mappingRegistry.getMappings().keySet(), matches, request);

}

if (!matches.isEmpty()) {

Comparator<AbstractHandlerMethodMapping.Match> comparator = new AbstractHandlerMethodMapping.MatchComparator(this.getMappingComparator(request));

matches.sort(comparator);

AbstractHandlerMethodMapping.Match bestMatch = (AbstractHandlerMethodMapping.Match)matches.get(0);

if (matches.size() > 1) {

if (this.logger.isTraceEnabled()) {

this.logger.trace(matches.size() + " matching mappings: " + matches);

}

if (CorsUtils.isPreFlightRequest(request)) {

return PREFLIGHT_AMBIGUOUS_MATCH;

}

AbstractHandlerMethodMapping.Match secondBestMatch = (AbstractHandlerMethodMapping.Match)matches.get(1);

if (comparator.compare(bestMatch, secondBestMatch) == 0) {

Method m1 = bestMatch.handlerMethod.getMethod();

Method m2 = secondBestMatch.handlerMethod.getMethod();

String uri = request.getRequestURI();

throw new IllegalStateException(“Ambiguous handler methods mapped for '” + uri + “': {” + m1 + ", " + m2 + “}”);

}

}

request.setAttribute(BEST_MATCHING_HANDLER_ATTRIBUTE, bestMatch.handlerMethod);

this.handleMatch(bestMatch.mapping, lookupPath, request);

//多个请求会返回最佳请求

return bestMatch.handlerMethod;

} else {

return this.handleNoMatch(this.mappingRegistry.getMappings().keySet(), lookupPath, request);

}

}

然后在进行了其他操作 加入过滤器 最终返回了handler -getHandler方法结束。

2.getHandlerAdapter

获取处理器适配器。

protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {

if (this.handlerAdapters != null) {

Iterator var2 = this.handlerAdapters.iterator();

while(var2.hasNext()) {

HandlerAdapter adapter = (HandlerAdapter)var2.next();

//和处理器映射器比对

if (adapter.supports(handler)) {

return adapter;

}

}

}

throw new ServletException(“No adapter for handler [” + handler + “]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler”);

}

3.mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

调用controller方法,通过反射,调用到controller中,返回ModelAndView。

@Nullable

protected Object doInvoke(Object… args) throws Exception {

ReflectionUtils.makeAccessible(this.getBridgedMethod());

try {

return this.getBridgedMethod().invoke(this.getBean(), args);

} catch (IllegalArgumentException var4) {

this.assertTargetBean(this.getBridgedMethod(), this.getBean(), args);

String text = var4.getMessage() != null ? var4.getMessage() : “Illegal argument”;

throw new IllegalStateException(this.formatInvokeError(text, args), var4);

} catch (InvocationTargetException var5) {

Throwable targetException = var5.getTargetException();

if (targetException instanceof RuntimeException) {

throw (RuntimeException)targetException;

} else if (targetException instanceof Error) {

throw (Error)targetException;

} else if (targetException instanceof Exception) {

完结

Redis基于内存,常用作于缓存的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。

Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

stanceof Exception) {

完结

Redis基于内存,常用作于缓存的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。

Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。

[外链图片转存中…(img-2xC0SlCQ-1715584128411)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值