
从上图可以看出,HandlerMapping的继承结构分为两支,一支继承自
AbstractHandlerMethodMapping,另一之继承自
AbstractUrlHandlerMapping,而这两支都继承自抽象类AbstractHandlerMapping;所以,我们先分析AbstractHandlerMapping,然后再分析AbstractHandlerMethodMapping和AbstractUrlHandlerMapping;
AbstractHandlerMapping
AbstractHandlerMapping是HandlerMapping的抽象实现;采用了模板模式对整体进行设计,子类通过重写模板方法即可完成具体业务;
HandlerMapping的作用是根据request查找Handler和Interceptors;
获取Handler的过程通过模板方法getHandlerInternal交给子类去实现;AbstractHandlerMapping中保存了所用配置的Interceptor,在获取到Handler后会自己根据从request提取的lookupPath将相应的Interceptors装配上去,当然子类也可以通过getHandlerInternal方法设置自己的Interceptor,getHandlerInternal的返回值为Object类型;
创建AbstractHandlerMapping之器
AbstractHandlerMapping继承了WebApplicationObjectSupport;
初始化时会自动调用模板方法initApplicationContext,AbstractHandlerMapping的创建就是在initApplicationContext方法里实现的;
protected void initApplicationContext() throws BeansException {
//模板方法,用于给子类提供一个添加(或者修改)Interceptors的入口
//这个方法,在Spring并没有使用
extendInterceptors(this.interceptors);
//将Spring MVC容器及父容器中的所有MappedInterceptor类型的Bean添加到mappedInterceptors属性
detectMappedInterceptors(this.mappedInterceptors);
//初始化Interceptor
initInterceptors();
}