当前位置: 首页 > 知识库问答 >
问题:

类级url注释对性能的影响

童化
2023-03-14

我对Spring请求映射的内部工作很好奇。在类级别使用requestmapping注释是否会加快解析请求的控制器?

在Spring Boot中@RequestMapping如何在内部工作?-阅读这个答案和类似的答案。控制器和URL是否在初始启动期间映射并存储在注册表中?因为我在启动Spring Boot应用程序时发现了这些日志跟踪。

控制器+方法和URL是最初在启动期间映射的,还是每次为请求迭代?我想知道在请求映射到Controller的过程中,有一个类级别的请求注释是否会有什么不同。

共有1个答案

齐飞星
2023-03-14

控制器+方法和URL是最初在启动期间映射的,还是每次为请求迭代?

使用默认的handlermapping实现,Spring控制器的Url映射在启动时完成。在每次请求调用时这样做是没有意义的,因为一旦容器启动,url映射就无法更改。
除此之外,请将控制器视为bean,这些控制器由Spring设置/初始化一次:在容器启动时。因此,将@requestmapping的类级注释简单地看作是一种干燥的快捷方式。

下面是您应该感兴趣的代码:AbstracTurlHandlerMapping.GetHandlerInternal()HandlerMapping的默认实现在引擎盖下使用的代码:

@Override
@Nullable
protected Object getHandlerInternal(HttpServletRequest request) throws Exception {
    String lookupPath = getUrlPathHelper().getLookupPathForRequest(request);
    Object handler = lookupHandler(lookupPath, request);
    if (handler == null) {
        // We need to care for the default handler directly, since we need to
        // expose the PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE for it as well.
        Object rawHandler = null;
        if ("/".equals(lookupPath)) {
            rawHandler = getRootHandler();
        }
        if (rawHandler == null) {
            rawHandler = getDefaultHandler();
        }
        if (rawHandler != null) {
            // Bean name or resolved handler?
            if (rawHandler instanceof String) {
                String handlerName = (String) rawHandler;
                rawHandler = obtainApplicationContext().getBean(handlerName);
            }
            validateHandler(rawHandler, request);
            handler = buildPathExposingHandler(rawHandler, lookupPath, lookupPath, null);
        }
    }
    if (handler != null && logger.isDebugEnabled()) {
        logger.debug("Mapping [" + lookupPath + "] to " + handler);
    }
    else if (handler == null && logger.isTraceEnabled()) {
        logger.trace("No handler mapping found for [" + lookupPath + "]");
    }
    return handler;
}

有趣的是,处理程序在bean的整个生命周期中只创建了一次:

if (handler == null) { 
  // init handler...
} 
return handler;

请注意,定义GetHandler()HandlerMapping接口指定您可以为映射解析创建自己的逻辑:

接口,这些对象定义请求和处理程序对象之间的映射。这个类可以由应用程序开发人员实现,尽管这不是必需的,因为BeanNameUrlHandlerMapping和RequestMappingHandlerMapping包含在框架中。如果应用程序上下文中没有注册HandlerMapping bean,则默认使用前者。HandlerMapping实现可以支持映射的拦截器,但不必支持。

因此,通过创建自己的处理程序映射实现,不缓存url映射是完全可能的,但出于合理的原因,这当然不是默认实现的行为。

 类似资料:
  • 问题内容: 我有这个JavaWeb应用程序,它可以从电子表格上传成千上万的数据,该电子表格是从上到下按行读取的。我用来在服务器端显示应用程序当前正在读取的行。 -我知道要创建一个日志文件。实际上,我正在创建一个日志文件,同时在服务器提示符下显示日志。 还有其他方法可以在提示上打印当前数据? 问题答案: 它可能会影响您的应用程序性能。大小会因您所运行的硬件类型和主机上的负载而异。 可以将其转化为性能

  • 前言 HTTPS 在保护用户隐私,防止流量劫持方面发挥着非常关键的作用,但与此同时,HTTPS 也会降低用户访问速度,增加网站服务器的计算资源消耗。 本文主要介绍 https 对用户体验的影响。 HTTPS 对访问速度的影响 在介绍速度优化策略之前,先来看下 HTTPS 对速度有什么影响。影响主要来自两方面: 协议交互所增加的网络 RTT(round trip time)。 加解密相关的计算耗时。

  • TestNG有一个很好的特性,可以将注释添加到测试类中(而不是测试方法)。根据文档,当类被注释时,类上所有公共的void返回方法都被视为测试方法。 更新:现在作为一个问题提出。

  • 我试图执行一个集成测试,我的类与@Transactional注释不能自动连接到一个测试类与NoSuchBean定义异常。我把它注释出来,检查了一份装载豆子的列表,我的服务就在那里,只是没有注射。 组织。springframework。豆。工厂BeanCreationException:创建名为“com”的bean时出错。icsynergy。西姆。服务DBIntegrationServiceTest

  • 他们看到的Watson语音到文本服务器最近的问题是,无法在单个实例中运行持续时间大于10分钟的音频文件,其次,当运行语音到文本的文件小于10分钟时,有时与Watson服务器的TCP连接丢失。 他们基本上是在python的Watson服务器上使用web套接字,并且想了解对于持续时间较长的音频文件(例如,我们的会议持续到3小时),什么是运行语音到文本的最佳方式。为web套接字上的连接丢失配置瓶颈的最佳

  • 问题内容: 嵌入式注释如何影响数据库? SQL查询将如何改变? 使用注释的典型用例是什么? 问题答案: 嵌入式注释如何影响数据库? 它根本不影响它。在ORM提供程序层上,来自嵌入式实体的所有字段都 将 与父实体 合并 ,并像对待它们始终在其中声明一样。换句话说,它的工作方式就好像您将所有字段,获取器和设置器直接复制到包含嵌入式对象的实体中一样。 SQL查询将如何改变? 他们不会。您无需更改任何内容