前言
关于SpringMVC初始化ContextLoader中的XMLWebApplicationContext,以及DispatcherServlet初始化等等,这样的原理 已经有N多的前辈和牛人总结过了, 我就不在这里重复轮子了。~
废话
Spring源码还是层次十分分明的,只要了解原理,相信看起来也不会很困难, 但是它的精髓还有其中使用到的设计模式, “架构”少不了模式, Spring正是因为采用大量的模式而使其易于用户扩展。
正文
找到DispatcherServlet类中的doDispatch体,我们可以看到,它的作用是相当于在Servlet的 doService调用的。 也就是用来传递request给我们编写的Controller并执行相应的方法、返回ModeView对象。
执行的代码片段:
- ...
- HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
- mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
- ...
mappedHandler.getHandler()得到的是Controller对象
而此处并非采用直接 调用.handlerRequest或者MultiActionController中编写的自定义方法,而采用了一个HandlerAdapter 的接口。
此处采用了适配器模式, 由于Controller的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用Controller方法,需要在代码中写成如下形式:
- if(mappedHandler.getHandler() instanceof MultiActionController){
- ((MultiActionController)mappedHandler.getHandler()).xxx
- }else if(mappedHandler.getHandler() instanceof XXX){
- ...
- }else if(...){
- ...
- }
- ...
这样假设如果我们增加一个HardController,就要在代码中加入一行 if(mappedHandler.getHandler() instanceof HardController)
这种形式就使得程序难以维护,也违反了设计模式中的开闭原则 -- 对扩展开放,对修改关闭。
因此Spring定义了一个适配接口,使得每一种Controller有一种对应的适配器实现类,
让适配器代替controller执行相应的方法。这样在扩展Controller 时,只需要增加一个适配器类就完成了SpringMVC的扩展了,真的是很精巧的做法!
废话不多说还是上代码吧,为了看得清楚,就自己实现一套代码来模拟springMVC, 直接贴Spring源码容易降低关注点。
- //定义一个Adapter接口
- public interface HandlerAdapter {
- public boolean supports(Object handler);
- public void handle(Object handler);
- }
- //以下是三种Controller实现
- public interface Controller {
- }
- public class HttpController implements Controller{
- public void doHttpHandler(){
- System.out.println("http...");
- }
- }
- public class SimpleController implements Controller{
- public void doSimplerHandler(){
- System.out.println("simple...");
- }
- }
- public class AnnotationController implements Controller{
- public void doAnnotationHandler(){
- System.out.println("annotation...");
- }
- }
- //下面编写适配器类
- public class SimpleHandlerAdapter implements HandlerAdapter {
- public void handle(Object handler) {
- ((SimpleController)handler).doSimplerHandler();
- }
- public boolean supports(Object handler) {
- return (handler instanceof SimpleController);
- }
- }
- public class HttpHandlerAdapter implements HandlerAdapter {
- public void handle(Object handler) {
- ((HttpController)handler).doHttpHandler();
- }
- public boolean supports(Object handler) {
- return (handler instanceof HttpController);
- }
- }
- public class AnnotationHandlerAdapter implements HandlerAdapter {
- public void handle(Object handler) {
- ((AnnotationController)handler).doAnnotationHandler();
- }
- public boolean supports(Object handler) {
- return (handler instanceof AnnotationController);
- }
- }
- //模拟一个DispatcherServlet
- import java.util.ArrayList;
- import java.util.List;
- public class DispatchServlet {
- public static List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>();
- public DispatchServlet(){
- handlerAdapters.add(new AnnotationHandlerAdapter());
- handlerAdapters.add(new HttpHandlerAdapter());
- handlerAdapters.add(new SimpleHandlerAdapter());
- }
- public void doDispatch(){
- //此处模拟SpringMVC从request取handler的对象,仅仅new出,可以出,
- //不论实现何种Controller,适配器总能经过适配以后得到想要的结果
- // HttpController controller = new HttpController();
- // AnnotationController controller = new AnnotationController();
- SimpleController controller = new SimpleController();
- //得到对应适配器
- HandlerAdapter adapter = getHandler(controller);
- //通过适配器执行对应的controller对应方法
- adapter.handle(controller);
- }
- public HandlerAdapter getHandler(Controller controller){
- for(HandlerAdapter adapter: this.handlerAdapters){
- if(adapter.supports(controller)){
- return adapter;
- }
- }
- return null;
- }
- public static void main(String[] args){
- new DispatchServlet().doDispatch();
- }
- }
通过这个模式可以看出 开源代码 中的精妙, 我们在看框架源码时需要有目标的看,这样会找到很多自己需要学习的东西, 目前很多分析源码的帖子大部分是讲解what,how,
以此来抛砖引玉,希望各位能够一起来讨论 “why ”
----------转发:http://zouruixin.iteye.com/blog/1441846
---------------------
关于适配器及springmvc的应用这篇博文已经讲得比较清楚了,自己在学习过程中也写了个类似的demo来加深理解,源代码见附件。
相关推荐
- **配置处理器适配器**:在`springmvc.xml`中配置处理器适配器,如`SimpleControllerHandlerAdapter`,以便能够执行实现`Controller`接口的处理器。 - **开发处理器**:创建一个实现`Controller`接口的类,例如`...
3. **配置处理器适配器**:在`springmvc.xml`中定义处理器适配器。 4. **开发Handler**:实现`Controller`接口,并定义具体的处理逻辑。 5. **视图渲染**:返回包含数据的ModelAndView对象,由视图解析器解析成具体...
SpringMVC是Java Spring框架中的一个重要组成部分,它是一个基于Java实现MVC设计模式的请求驱动类型的轻量级Web框架。学习SpringMVC的目的是为了提高Java Web开发的效率和质量,通过使用SpringMVC可以更方便地实现...
本项目骨架提供了XML和JavaConfig两种配置方式,让我们详细探讨这两种配置方法及其在SpringMVC中的应用。 1. XML配置: 在传统的SpringMVC项目中,XML配置文件(如`spring-servlet.xml`)是核心,用于定义组件、...
在`springmvc.xml`配置文件中配置处理器适配器。 ##### 7.4 开发Handler 实现`Controller`接口,并确保符合`HandlerAdapter`的要求。 通过以上知识点的学习,我们不仅了解了SpringMVC的基本原理和用法,还掌握了...
SpringMVC是Spring框架的一个模块,专为构建Java Web应用程序而设计。它是Model-View-Controller(MVC)设计模式的实现,旨在简化Web开发,提高代码的可...这将有助于提升你的Web开发技能,特别是在大型企业级应用中。
下面将详细讲解这四个框架的整合及其在实际项目中的应用。 Spring框架是核心,它提供了依赖注入(DI)和面向切面编程(AOP)等特性,使得代码更加模块化,易于测试和管理。SpringMVC是Spring框架的一部分,专门用于...
在IT行业中,Spring、SpringMVC和MyBatis是三个非常重要的开源框架,它们在企业级Web应用开发中被广泛使用。Spring作为一个全面的后端应用程序框架,提供了依赖注入(DI)和面向切面编程(AOP)等功能,极大地简化了...
它提供了丰富的功能,如声明式异常处理、数据绑定、模型-视图-适配器模式支持以及松散耦合的组件。Spring MVC通过DispatcherServlet作为前端控制器,负责接收HTTP请求并分发到相应的处理器,使得应用结构清晰且易于...
SpringMVC是Spring框架的一个模块,主要用于简化Web应用程序的开发过程。它遵循Model-View-Controller(MVC)设计模式,帮助开发者更好地组织代码结构,提高代码的可维护性和可扩展性。本文将详细解释SpringMVC的...
在`springmvc.xml`中配置处理器适配器。 2. 使用`org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter`来处理实现了Controller接口的处理器。 ##### 3.4 开发Handler - **实现**: ```java ...
- **单例模式**:SpringMVC 中的控制器默认采用单例模式,这意味着在整个应用程序中只有一个实例。 - **潜在问题**:单例模式下的控制器可能会出现线程安全问题,特别是在处理多个并发请求时。 - **解决方案**:为了...
在Java开发领域,Spring、SpringMVC和MyBatis是三个非常重要的开源框架,它们各自在不同的层次上解决了Web应用中的问题。Spring作为全面的框架,提供了依赖注入(DI)和面向切面编程(AOP)等核心特性;SpringMVC是...
在SpringMVC应用中,通常需要配置以下内容: - 配置DispatcherServlet:定义servlet名称、映射路径等。 - 配置HandlerMapping和HandlerAdapter:定义处理器的查找和调用方式。 - 配置ViewResolver:设置视图解析规则...
SpringMVC作为一款优秀的Web应用框架,在实际项目中得到了广泛的应用。其简洁的设计理念、灵活的配置选项以及丰富的功能特性,使其成为Java Web开发领域的佼佼者。通过深入学习SpringMVC的各个组件及其工作原理,...
在探讨SpringMVC之前,我们首先回顾一下MVC(Model-View-Controller)架构模式的基本概念及其重要性。 ##### MVC架构概述 MVC是一种软件架构设计模式,用于将应用程序的业务逻辑和表示层分离,从而使开发过程更加...
在IT行业中,构建高效、可维护的企业级应用是至关重要的,而Spring、SpringMVC和Hibernate这三大框架的整合正是实现这一目标的常用途径。本文将深入探讨如何使用Maven来管理和集成这些框架,以及它们各自的核心功能...
在SpringMVC的整个执行流程中,每个组件都有其特定的职责,它们协同工作,实现了请求的接收、处理和响应的全过程。这种设计模式使得SpringMVC具有高度可扩展性和灵活性,能够适应各种复杂的Web应用需求。开发者可以...