SpringMVC中的适配器HandlerAdapter

3 篇文章 0 订阅

DispatcherServlte的initHandlerAdapters方法根据配置文件信息把HandlerAdapter注册到handlerAdapters(List)中。

如果在配置文件中没有配置,默认配置会读取DispatcherServlte.properties文件,该文件中配置了三种HandlerAdapter:HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter和AnnotationMethodHandlerAdapter。

SimpleControllerHandlerAdapter :继承Controller方式所使用的适配器
HttpRequestHandlerAdapter      :HTTP请求处理器适配器
RequestMappingHandlerAdapter   :注解方式(@Controller)的处理器适配器

getHandler方法根据请求遍历注册到handlerAdapters中的适配器拿到对应的适配器处理。

for (HandlerMapping hm : this.handlerMappings) {
		HandlerExecutionChain handler = hm.getHandler(request);
		if (handler != null) {
		   return handler;
		}
}

HandlerAdapter接口有三个方法:
在这里插入图片描述

supports方法:是判断该适配器是否支持这个HandlerMethod,就是当得到一个handler时,该接口子类该方法做判断(就是类似handler instanceof Controller的判断方式),用来得到适配这个handler的适配器子类。
handle方法:用来执行控制器处理函数,获取ModelAndView 。就是根据该适配器调用规则执行handler方法。

如果正常编写调用,就需要使用多个if else判断instance of

if(handler instanceof HttpRequestHandler){
  handle1();//HttpRequestHandler的处理方式
} else if (handler instanceof Controller){
  handle2();//Controller的处理方式
} else if (handler instanceof Servlet){
  handle3();//Servlet的处理方式
}

这种方法再添加新的处理器实现方式,就需要修改源码,新增else添加处理逻辑,不符合对扩展开放,对修改关闭原则。使用了HandlerAdapter后,当需要新增一种处理器(Controller)时,只需要新增一个HandlerAdapter即可,判断逻辑在他的supports方法中,处理逻辑在handle中,不需要修改任何其他代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
是的,Spring MVC框架使用了适配器模式。适配器模式的作用是将不同类型的处理器适配到统一的接口上,使得框架能够统一处理不同类型的处理器。在Spring MVCHandlerAdapter就是一个适配器,它负责将不同类型的处理器适配到统一的Controller接口上,使得框架能够统一调用Controller的方法。 使用适配器模式的原因是为了解决不同类型的处理器调用方式的不确定性。如果直接调用Controller方法,就需要使用if-else语句来判断处理器的类型,然后执行相应的方法。这样的实现方式不仅不灵活,而且当需要扩展Controller时,就需要修改原来的代码,违背了开闭原则。 Spring MVC通过适配器模式来获取对应的Controller。它定义了一个适配接口,使得每一种Controller都有一种对应的适配器实现类。适配器代替Controller执行相应的方法。当需要扩展Controller时,只需要增加一个适配器类就可以完成Spring MVC的扩展。 以下是模拟代码实现适配器模式的示例: ```java // 定义Controller接口 public interface Controller { void handleRequest(); } // 定义具体的Controller实现类 public class UserController implements Controller { @Override public void handleRequest() { System.out.println("Handling user request"); } } // 定义适配器接口 public interface HandlerAdapter { boolean supports(Object handler); void handle(Object handler); } // 定义UserController的适配器实现类 public class UserControllerAdapter implements HandlerAdapter { @Override public boolean supports(Object handler) { return handler instanceof UserController; } @Override public void handle(Object handler) { UserController userController = (UserController) handler; userController.handleRequest(); } } // 定义DispatcherServlet类,用于调度请求 public class DispatcherServlet { private List<HandlerAdapter> handlerAdapters; public DispatcherServlet() { handlerAdapters = new ArrayList<>(); handlerAdapters.add(new UserControllerAdapter()); } public void doDispatch(Object handler) { for (HandlerAdapter adapter : handlerAdapters) { if (adapter.supports(handler)) { adapter.handle(handler); break; } } } } // 测试代码 public class Main { public static void main(String[] args) { UserController userController = new UserController(); DispatcherServlet dispatcherServlet = new DispatcherServlet(); dispatcherServlet.doDispatch(userController); } } ``` 以上代码演示了Spring MVC适配器模式的实现。DispatcherServlet负责调度请求,根据不同的处理器类型选择对应的适配器来处理请求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值