Spring MVC 核心架构:从原理到实现 第一篇Spring MVC 核心架构解析文章目录第一篇Spring MVC 核心架构解析1. 传统Servlet开发示例包结构LegacyServlet.java2. Spring MVC 实现对比包结构2.1 WebInitializer.java2.2 AppConfig.java2.3 DemoController.java3. 自定义HandlerMapping实现CustomHandlerMapping.java4. 测试对比4.1 访问路径对比4.2 处理流程对比图5. 关键注解说明6. 项目运行准备1. 传统Servlet开发示例包结构src/main/java └── crj └── example └── servlet ├── LegacyServlet.javaLegacyServlet.javapackagecrj.example.servlet;importjavax.servlet.*;importjavax.servlet.http.*;importjava.io.IOException;/** * 传统Servlet实现方式 * 访问路径http://localhost:8080/legacy */publicclassLegacyServletextendsHttpServlet{OverrideprotectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{// 直接处理请求和响应response.setContentType(text/plain);response.getWriter().write(Legacy Servlet Response);}}2. Spring MVC 实现对比包结构src/main/java └── crj └── example └── spring ├── config │ ├── WebInitializer.java // 替代web.xml │ └── AppConfig.java // Spring配置 ├── controller │ └── DemoController.java └── custom └── CustomHandlerMapping.java2.1 WebInitializer.javapackagecrj.example.spring.config;importorg.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;/** * 替代传统web.xml配置 * 相当于注册DispatcherServlet并指定配置类 */publicclassWebInitializerextendsAbstractAnnotationConfigDispatcherServletInitializer{// 根配置非Web组件OverrideprotectedClass?[]getRootConfigClasses(){returnnewClass[0];}// DispatcherServlet配置类OverrideprotectedClass?[]getServletConfigClasses(){returnnewClass[]{AppConfig.class};}// 映射路径处理所有请求OverrideprotectedString[]getServletMappings(){returnnewString[]{/};}}2.2 AppConfig.javapackagecrj.example.spring.config;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.ComponentScan;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.HandlerMapping;importorg.springframework.web.servlet.config.annotation.EnableWebMvc;importorg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;importcrj.example.spring.custom.CustomHandlerMapping;ConfigurationEnableWebMvcComponentScan(basePackagescrj.example.spring.controller)publicclassAppConfig{/** * 自定义HandlerMapping示例 * 优先级高于默认的RequestMappingHandlerMapping */BeanpublicHandlerMappingcustomHandlerMapping(){CustomHandlerMappingmappingnewCustomHandlerMapping();mapping.setOrder(0);// 设置最高优先级returnmapping;}/** * 默认的注解驱动HandlerMapping */BeanpublicRequestMappingHandlerMappingrequestMappingHandlerMapping(){returnnewRequestMappingHandlerMapping();}}2.3 DemoController.javapackagecrj.example.spring.controller;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.ResponseBody;ControllerpublicclassDemoController{/** * 注解驱动控制器示例 * 访问路径http://localhost:8080/spring */GetMapping(/spring)ResponseBodypublicStringhandleRequest(){returnSpring MVC Response;}}3. 自定义HandlerMapping实现CustomHandlerMapping.javapackagecrj.example.spring.custom;importjavax.servlet.http.HttpServletRequest;importorg.springframework.core.Ordered;importorg.springframework.web.servlet.HandlerExecutionChain;importorg.springframework.web.servlet.handler.AbstractHandlerMapping;/** * 自定义HandlerMapping示例 * 处理以 /custom 开头的请求 */publicclassCustomHandlerMappingextendsAbstractHandlerMapping{OverrideprotectedObjectgetHandlerInternal(HttpServletRequestrequest)throwsException{Stringurirequest.getRequestURI();// 匹配以/custom开头的请求if(uri.startsWith(/custom)){return(Runnable)()-{try{request.getServletResponse().getWriter().write(Custom HandlerMapping Response);}catch(Exceptione){thrownewRuntimeException(e);}};}returnnull;}OverridepublicintgetOrder(){returnOrdered.HIGHEST_PRECEDENCE;// 最高优先级}}4. 测试对比4.1 访问路径对比请求类型URL响应内容传统Servlet/legacyLegacy Servlet Response注解驱动Controller/springSpring MVC Response自定义HandlerMapping/custom/anyCustom HandlerMapping Response4.2 处理流程对比图5. 关键注解说明注解/类作用说明Controller标记类为控制器配合RequestMapping使用EnableWebMvc启用Spring MVC注解驱动配置AbstractHandlerMapping实现自定义请求映射逻辑的基类DispatcherServlet前端控制器统一处理所有请求并协调各组件工作6. 项目运行准备依赖配置pom.xmldependencies!-- Spring MVC --dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.3.20/version/dependency!-- Servlet API --dependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion4.0.1/versionscopeprovided/scope/dependency/dependencies部署说明使用Tomcat 9部署访问路径示例http://localhost:8080/legacyhttp://localhost:8080/springhttp://localhost:8080/custom/test下一篇预告《配置范式演进XML、JavaConfig 与 Spring Boot》将涵盖三种配置方式的详细对比静态资源配置最佳实践热部署技巧与性能调优