《SpringMvc中的适配器模式》

  适配器模式是将一个接口转换成目标接口,让程序有更好的复用性和扩展性。SpringMvc中的适配器处理器HandlerAdapter就是用了这个设计模式。

  HandlerAdapter是SpringMvc的处理器适配器,会根据传递过来的controller类型不同而调用不同的Handler进行处理,也就是调用请求的方法。

 HandlerAdapter处理的大致流程:

DispatchServlet中有一个集合维护所有的HandlerAdapter,如果配置文件中没有对适配器进行配置,那么DispatchServlet会在创建时对该变量进行初始化,注册所有默认的HandlerAdapter。DispatchServlet会根据传过来的Controller类型从该集合中寻找对应的HandlerAdapter子类进行处理,并且调用它的handler方法,handler通过反射调用具体的执行方法以及返回ModelAndView对象。


  源码解析:


//维护所有HandlerAdapter类的集合
private List<HandlerAdapter> handlerAdapters;
//初始化handlerAdapters
private void initHandlerAdapters(ApplicationContext context) {
代码省略...
}
//diDispatch中部分代码
//获得controller对应的适配器
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
//调用适配器的handler方法处理请求,并返回ModelAndView
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
//返回对应的controller的处理器
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
	for (HandlerAdapter ha : this.handlerAdapters) {
		if (logger.isTraceEnabled()) {
			logger.trace("Testing handler adapter [" + ha + "]");
		}
		if (ha.supports(handler)) {
			return ha;
		}
	}
	throw new ServletException("No adapter for handler [" + handler +
			"he DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
}

  让我们在看看HandlerAdapter的源码:

public interface HandlerAdapter {
	//判断该controller是否由该adapter处理
	boolean supports(Object handler);
	//处理请求
	ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
	
	long getLastModified(HttpServletRequest request, Object handler);

}
  通过适配器模式我们将所有的controller统一交给HandlerAdapter处理,免去了写大量的if-else语句对controller进行判断,也更利于扩展新的controller类型。



是的,Spring MVC框架使用了适配器模式适配器模式的作用是将不同类型的处理器适配到统一的接口上,使得框架能够统一处理不同类型的处理器。在Spring MVC,HandlerAdapter就是一个适配器,它负责将不同类型的处理器适配到统一的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负责调度请求,根据不同的处理器类型选择对应的适配器来处理请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值