springmvc流程大致分析3 初始化springmvc编程元素

来源:互联网 发布:最新伤感网络歌曲 编辑:程序博客网 时间:2024/05/11 17:06

通过第2步的操作,已经初始化好了webApplicationContext上下文,并调用相应的方法将上下文通过DispatcherServlet的onRefresh方法,传入DispatcherServlet,其方法定义如下:

protected void onRefresh(ApplicationContext context) {initStrategies(context);}protected void initStrategies(ApplicationContext context) {initMultipartResolver(context);initLocaleResolver(context);initThemeResolver(context);initHandlerMappings(context);initHandlerAdapters(context);initHandlerExceptionResolvers(context);initRequestToViewNameTranslator(context);initViewResolvers(context);initFlashMapManager(context);}

以initHandlerMappings方法为例,其它方法的初始化逻辑都是相似的。

private void initHandlerMappings(ApplicationContext context) {this.handlerMappings = null;if (this.detectAllHandlerMappings) {// Find all HandlerMappings in the ApplicationContext, including ancestor contexts.Map<String, HandlerMapping> matchingBeans =BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);if (!matchingBeans.isEmpty()) {this.handlerMappings = new ArrayList<HandlerMapping>(matchingBeans.values());// We keep HandlerMappings in sorted order.OrderComparator.sort(this.handlerMappings);}}else {try {HandlerMapping hm = context.getBean(HANDLER_MAPPING_BEAN_NAME, HandlerMapping.class);this.handlerMappings = Collections.singletonList(hm);}catch (NoSuchBeanDefinitionException ex) {// Ignore, we'll add a default HandlerMapping later.}}// Ensure we have at least one HandlerMapping, by registering// a default HandlerMapping if no other mappings are found.if (this.handlerMappings == null) {this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class);if (logger.isDebugEnabled()) {logger.debug("No HandlerMappings found in servlet '" + getServletName() + "': using default");}}}

其逻辑是:

1.判断detectAllHandlerMappings是否为true(默认是true),
|-如果true,则将上下文中所有类型是HandlerMapping的bean都添加到handlerMappings这个list
|-如果false,则将上下文中名字是handlerMapping的bean添加到一个只有1个元素的list中,并将这个list赋值给handlerMappings


2.经过第1步的操作如果handlerMappings依然为null,则调用getDefaultStrategies方法,由spring的默认策略初始化handlerMappings

getDefaultStrategies是一个范型的方法,承担所有SpringMVC编程元素的默认初始化策略。
方法的逻辑是:以传递类的名称为键,从defaultStrategies变量中获取具体的实现类,然后反射初始化。

而defaultStrategies变量的初始化,是在静态代码块中读取DispatcherServlet.properties初始化的。

0 0
原创粉丝点击