解析Spring:架构与组件

  1. DispatcherServlet

DispatcherServlet 是 Spring MVC 的前端控制器,它负责接收所有的 HTTP 请求,并将请求分发到相应的处理器。它是整个 Spring MVC 框架的核心组件。

初始化:DispatcherServlet 在启动时会初始化一系列的组件,如 HandlerMapping、HandlerAdapter、ViewResolver 等。 请求处理:接收到请求后,DispatcherServlet 会通过 HandlerMapping 找到合适的处理器,然后通过 HandlerAdapter 调用处理器方法。

  1. HandlerMapping HandlerMapping 负责将请求映射到处理器。Spring MVC 提供了多种 HandlerMapping 实现,包括:

RequestMappingHandlerMapping:基于 @RequestMapping 注解进行请求映射。 BeanNameUrlHandlerMapping:基于 Bean 名称进行请求映射。 SimpleUrlHandlerMapping:基于 URL 模式进行请求映射。

  1. HandlerAdapter HandlerAdapter 负责调用处理器方法。Spring MVC 提供了多种 HandlerAdapter 实现,包括:

RequestMappingHandlerAdapter:支持基于 @RequestMapping 注解的方法调用。 HttpRequestHandlerAdapter:支持 HttpRequestHandler 接口的方法调用。

  1. Controller 控制器是处理请求的主要组件。在 Spring MVC 中,控制器类通常使用 @Controller 注解标记,并且方法上使用 @RequestMapping 或其派生注解(如 @GetMapping, @PostMapping)来指定处理哪些请求。

  2. ModelAndView ModelAndView 对象用于封装模型数据和视图信息。控制器方法可以返回 ModelAndView 对象,其中包含模型数据和视图名称。

  3. ViewResolver 视图解析器负责将逻辑视图名称解析为具体的视图对象。常用的视图解析器有:

InternalResourceViewResolver:用于 JSP 视图。 ThymeleafViewResolver:用于 Thymeleaf 视图。 FreeMarkerViewResolver:用于 FreeMarker 视图。

  1. View 视图负责渲染最终的页面,展示给用户。视图可以是 JSP、FreeMarker、Thymeleaf 等模板引擎生成的页面。

工作流程

客户端发送请求:客户端(如浏览器)发送 HTTP 请求到服务器。 请求到达 DispatcherServlet:请求被 DispatcherServlet 捕获。 HandlerMapping 定位处理器:DispatcherServlet 使用 HandlerMapping 查找处理请求的控制器方法。 HandlerAdapter 调用处理器:DispatcherServlet 使用 HandlerAdapter 调用控制器方法。 控制器处理请求:控制器方法处理请求,返回 ModelAndView 对象。 ViewResolver 解析视图:DispatcherServlet 使用 ViewResolver 将逻辑视图名称解析为具体的视图对象。 视图渲染:视图对象渲染最终的页面,并返回给客户端。 配置方式 XML 配置 传统的 Spring MVC 配置通常是通过 XML 文件完成的。

Java 配置

现代的 Spring MVC 项目通常使用 Java 配置。以下是一个简单的 Java 配置示例:

import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration @ComponentScan(basePackages = "com.example.controller") @EnableWebMvc public class WebConfig implements WebMvcConfigurer {

复制代码
@Bean
public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
}

}

最佳实践 分层设计:将应用分为控制器层、服务层和数据访问层,保持各层职责清晰。 异常处理:使用 @ControllerAdvice 和 @ExceptionHandler 注解来集中处理异常。 数据验证:使用 JSR-303 标准的数据验证框架(如 Hibernate Validator)来验证请求参数。 国际化:使用 Spring 的国际化支持来提供多语言界面。 安全性:使用 Spring Security 来保护应用的安全性。 性能优化:合理使用缓存、异步处理等技术来提升应用性能。 示例项目 假设我们有一个简单的 Spring Boot 项目,使用 Spring MVC 构建一个基本的 Web 应用程序。

项目目录结构

src/main/java │── com.example │ └── controller │ └── HelloWorldController.java │── com.example.service │ └── HelloWorldService.java │── com.example.repository │ └── HelloWorldRepository.java └── Application.java

src/main/resources │── static │── templates │── application.properties

控制器 (HelloWorldController.java)

package com.example.controller;

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import com.example.service.HelloWorldService;

@Controller public class HelloWorldController {

复制代码
@Autowired
private HelloWorldService helloWorldService;
​
@GetMapping("/hello")
public String hello(Model model) {
    String message = helloWorldService.getMessage();
    model.addAttribute("message", message);
    return "hello"; // 返回视图名称
}

}

服务层 (HelloWorldService.java)

package com.example.service;

import org.springframework.stereotype.Service;

@Service public class HelloWorldService {

复制代码
public String getMessage() {
    return "Hello, Spring MVC!";
}

}

全局异常处理 (GlobalExceptionHandler.java)

package com.example.controller;

import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.servlet.ModelAndView;

@ControllerAdvice public class GlobalExceptionHandler {

复制代码
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ModelAndView handleException(Exception ex) {
    ModelAndView modelAndView = new ModelAndView("error");
    modelAndView.addObject("errorMessage", ex.getMessage());
    return modelAndView;
}

}

相关推荐
AI小码5 小时前
LLM 应用的缓存工程:当每次 API 调用都在燃烧成本
java·人工智能·spring·计算机·llm·编程·api
Hui Baby5 小时前
Spring Security
java·后端·spring
Geek-Chow7 小时前
微服务认证与授权: 12 — JWKS 深入解析
spring·微服务·安全架构
编程(变成)小辣鸡7 小时前
Spring事务失效场景
java·后端·spring
一路向北North11 小时前
Spring Security OAuth2.0(18):资源服务测试
java·后端·spring
ahauedu13 小时前
多租户 RAG 知识库系统基于Spring Boot 4.0.5+Spring AI 2.0.0 + Milvus
spring·rag·springai2.0
一路向北North14 小时前
Spring Security OAuth2.0(19):JWT令牌
java·后端·spring
卓怡学长16 小时前
w268基于springboot + vue 物流系统
java·数据库·vue.js·spring boot·spring·intellij-idea
ACGkaka_17 小时前
Spring Boot 实战(四十二):集成 Spring AI 六大场景
人工智能·spring boot·spring
卓怡学长1 天前
w269基于spring boot + vue 候鸟监测数据管理系统
java·数据库·spring boot·spring·intellij-idea