Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 具有类级url注释对性能的影响_Spring_Spring Boot_Spring Mvc - Fatal编程技术网

Spring 具有类级url注释对性能的影响

Spring 具有类级url注释对性能的影响,spring,spring-boot,spring-mvc,Spring,Spring Boot,Spring Mvc,我对Spring请求映射的内部工作很好奇。在类级别使用requestmapping注释是否会加快解析请求的控制器 -阅读此答案和类似答案。控制器和URL是否在初始启动时映射并存储在注册表中?因为我在启动spring boot应用程序时发现了这些日志跟踪 日志跟踪: s、 w.s.m.m.a.RequestMappingHandlerMapping:将“{[/employeedetails/{name}/{id}| | |/employeedetails],方法=[GET],生成=[applica

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

-阅读此答案和类似答案。控制器和URL是否在初始启动时映射并存储在注册表中?因为我在启动spring boot应用程序时发现了这些日志跟踪

日志跟踪: s、 w.s.m.m.a.RequestMappingHandlerMapping:将“{[/employeedetails/{name}/{id}| | |/employeedetails],方法=[GET],生成=[application/json]}”映射到公共java.util.HashMap com.example.controller.EmployeeController.getEmployees(java.util.Optional,java.lang.String)抛出java.lang.InterruptedException 2019-06-01 13:32:48.289信息60719---[main]s.w.s.m.a.RequestMappingHandlerMapping:将“{[/error]}”映射到公共org.springframework.http.ResponseEntity>org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest)

控制器+方法和URL最初是在启动时映射的,还是每次请求时都会迭代?我想知道在将请求映射到控制器的过程中,类级请求注释是否会产生任何影响

控制器+方法和URL最初是在启动期间映射的 或者每次请求时都会迭代它们

使用默认的
HandlerMapping
实现,Spring控制器的Url映射在启动时完成。在每次请求调用时这样做是没有意义的,因为一旦容器启动,url映射就无法更改。
除了这个问题,将控制器视为bean,这些都是由Spring设置/初始化的:在容器启动时。 因此,考虑<代码> >请求映射的类级注释,简单地说是一个干涸的捷径。p> 下面是一段您应该感兴趣的代码:
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是 包括在框架内。如果没有,则前者为默认值 HandlerMappingbean在应用程序上下文中注册。 HandlerMapping实现可以支持映射拦截器,但不支持 不必

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