Spring 具有类级url注释对性能的影响
我对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最初是在启动期间映射的 或者每次请求时都会迭代它们 使用默认的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
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映射是完全可能的,但出于合理的原因,这当然不是默认实现的行为