在应用程序启动期间,Spring将识别所有Bean
通过 XML 配置、Java 配置或组件扫描的方式并将它们存储在ApplicationContext
.
Spring Boot 为您自动配置许多 Bean,包括请求映射处理程序映射 https://github.com/spring-projects/spring-boot/blob/fe1eb8b5f3ce4975bcbbb2a83192e84b32776175/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration.java#L402.
当这个 Bean 是已初始化 https://github.com/spring-projects/spring-framework/blob/5f074343607bd156646c30b5226152d60ec506dd/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMethodMapping.java#L193-L219它扫描 ApplicationContext 中是否有任何带有注释的 Bean@Controller
.
然后它迭代每个Controller
豆和looks https://github.com/spring-projects/spring-framework/blob/5f074343607bd156646c30b5226152d60ec506dd/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerMapping.java#L204-L209对于带有注释的方法@RequestMapping
。最后,它将这些映射/处理程序对保存在映射注册表 https://github.com/spring-projects/spring-framework/blob/5f074343607bd156646c30b5226152d60ec506dd/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMethodMapping.java#L475-L670
The DispatcherServlet
是您的应用程序的中央 HTTP 请求处理程序,它将search https://github.com/spring-projects/spring-framework/blob/5f074343607bd156646c30b5226152d60ec506dd/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java#L570-L601 the ApplicationContext
对于任何实现了HandlerMapping
接口,其中RequestMappingHandlerMapping
Bean 确实如此(通过继承的方式)。
然后它迭代这些 bean,要求它们解析该请求的相应处理程序。这RequestMappingHandlerMapping
bean 将通过以下方式解析处理程序寻找 https://github.com/spring-projects/spring-framework/blob/5f074343607bd156646c30b5226152d60ec506dd/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMethodMapping.java#L503-L505 its MappingRegistry
.
当找到匹配时,处理程序方法最终会被调用invoked https://github.com/spring-projects/spring-framework/blob/5f074343607bd156646c30b5226152d60ec506dd/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java#L967.