05-Spring MVC中的设计模式

Spring MVC中的设计模式分析

前端控制器模式 (Front Controller Pattern)

源码分析

在Spring MVC中,DispatcherServlet充当前端控制器,处理所有的HTTP请求,并将它们分派到合适的处理器。

java 复制代码
public class DispatcherServlet extends FrameworkServlet {
    
    @Override
    protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
        processRequest(request, response);
    }

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        HttpServletRequest processedRequest = request;
        HandlerExecutionChain mappedHandler = null;
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

        try {
            processedRequest = checkMultipart(request);
            mappedHandler = getHandler(processedRequest);
            
            if (mappedHandler == null || mappedHandler.getHandler() == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

            ModelAndView mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

            processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        } finally {
            if (asyncManager.isConcurrentHandlingStarted()) {
                return;
            }
        }
    }
}
功能及设计思想
  • 功能 :DispatcherServlet作为前端控制器,统一处理所有的HTTP请求,并将它们分派到合适的处理器。
  • 设计思想:使用前端控制器模式,提供一个单一的入口点来处理请求,简化了请求处理流程,集中管理控制逻辑。
解决的问题
  • 问题:如何集中管理HTTP请求,并将它们分派到合适的处理器。
  • 解决:通过前端控制器模式,Spring MVC可以集中管理请求处理逻辑,统一处理异常、视图解析等。
优缺点
  • 优点:集中管理请求处理逻辑,简化了控制流程,便于扩展和维护。
  • 缺点:所有请求都需要经过前端控制器,可能成为性能瓶颈。

适配器模式 (Adapter Pattern)

源码分析

Spring MVC中使用处理器适配器(如HandlerAdapter接口及其实现类)将不同类型的处理器(如Controller接口、注解驱动的控制器)适配到DispatcherServlet。

java 复制代码
public interface HandlerAdapter {
    
    boolean supports(Object handler);
    
    ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
    
    long getLastModified(HttpServletRequest request, Object handler);
}

示例:SimpleControllerHandlerAdapter

java 复制代码
public class SimpleControllerHandlerAdapter implements HandlerAdapter {
    
    @Override
    public boolean supports(Object handler) {
        return (handler instanceof Controller);
    }

    @Override
    public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return ((Controller) handler).handleRequest(request, response);
    }

    @Override
    public long getLastModified(HttpServletRequest request, Object handler) {
        return -1;
    }
}
功能及设计思想
  • 功能 :处理器适配器将不同类型的处理器适配到DispatcherServlet,实现请求处理逻辑。
  • 设计思想 :使用适配器模式,将处理器和前端控制器解耦,使得DispatcherServlet可以处理不同类型的处理器。
解决的问题
  • 问题:如何处理不同类型的处理器,并将它们统一适配到前端控制器。
  • 解决:通过适配器模式,Spring MVC可以灵活地支持多种类型的处理器,增强了框架的扩展性。
优缺点
  • 优点:增强了框架的扩展性和灵活性,可以轻松支持多种类型的处理器。
  • 缺点:引入了额外的适配层,增加了一些复杂度。

模板方法模式 (Template Method Pattern)

源码分析

Spring MVC中的AbstractController类使用模板方法模式定义了请求处理的通用流程,具体的处理逻辑由子类实现。

java 复制代码
public abstract class AbstractController extends WebContentGenerator implements Controller {
    
    @Override
    public final ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        checkAndPrepare(request, response, this instanceof LastModified);
        return handleRequestInternal(request, response);
    }
    
    protected abstract ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception;
}

示例:具体控制器实现

java 复制代码
public class HomeController extends AbstractController {

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
        return new ModelAndView("home");
    }
}
功能及设计思想
  • 功能 :AbstractController类定义了请求处理的通用流程,具体的处理逻辑由子类实现。
  • 设计思想:使用模板方法模式,将请求处理的通用步骤定义在基类中,具体步骤由子类实现,从而实现代码复用和扩展性。
解决的问题
  • 问题:如何在框架中定义一个通用的请求处理流程,并允许子类定制具体的处理逻辑。
  • 解决:通过模板方法模式,Spring MVC可以定义请求处理的通用步骤,同时允许子类在特定步骤中实现自己的逻辑。
优缺点
  • 优点:提高代码的复用性和扩展

性,简化子类的实现,确保了处理流程的一致性。

  • 缺点:要求子类实现特定的模板方法,可能限制了一些灵活性。

总结

  • 前端控制器模式 :在Spring MVC中,DispatcherServlet作为前端控制器,集中处理所有的HTTP请求,并将它们分派到合适的处理器,简化了请求处理流程,集中管理控制逻辑,提高了系统的可维护性和扩展性。
  • 适配器模式 :通过HandlerAdapter接口及其实现类,将不同类型的处理器适配到DispatcherServlet,实现了处理器与前端控制器的解耦,增强了框架的灵活性和扩展性。
  • 模板方法模式 :在AbstractController类中定义了请求处理的通用流程,具体的处理逻辑由子类实现,提高了代码的复用性和一致性,同时允许子类在特定步骤中实现自己的逻辑,增强了扩展性。

通过这些设计模式,Spring MVC实现了高内聚、低耦合的设计,提高了框架的灵活性、可维护性和扩展性。每个模式解决了特定的问题,并具有各自的优缺点,使得Spring MVC能够高效、灵活地处理复杂的Web请求。

相关推荐
后端LV1 小时前
一个注解不用写,给你的 Spring Boot 接口加上限流、日志、指标和钉钉告警
spring
卓怡学长2 小时前
w202springboot基于B_S架构的图书信息管理系统
java·spring boot·spring·intellij-idea
景熙55232 小时前
JDBC 详解:从原理到实战(含完整可运行 Demo)
java·spring·tomcat·mybatis·jdbc
程序猿乐锅2 小时前
一文讲透缓存穿透、击穿和雪崩
java·redis·spring·缓存·mybatis
程序猿乐锅3 小时前
【黑马点评 | 第七篇】Redis 分布式锁的两种实现
java·数据库·redis·分布式·spring·缓存
Zane19945 小时前
同一段单例代码,为什么在高并发下偶尔会创建出两个实例?聊聊哪种单例实现才是真的安全
设计模式
步行cgn5 小时前
Spring 负责注入的注解详解
java·sql·spring
Carl_奕然5 小时前
【智能体】Loop 的四种设计模式之:Agent Loop(2026 最新版)
人工智能·设计模式·语言模型
程序猿乐锅5 小时前
【黑马点评 | 第九篇】秒杀优化-异步实现
java·spring boot·redis·后端·spring·中间件·mybatis
Wx-bishekaifayuan5 小时前
springboot户外登山社交小程序19787-计算机课程设计、毕业设计
spring boot·后端·python·spring·elasticsearch·django·课程设计