首页 > 移动平台 > 详细

Spring MVC之HandlerMap 初始化(RequestmappingHandlerMapping)

时间:2016-03-19 02:07:57      阅读:545      评论:0      收藏:0      [点我收藏+]

??? AbstractHandlerMethodMapping类实现了InitializingBean接口,在属性初始化完成后会调用afterPropertiesSet()方法,在该方法中调用initHandlerMethods();进行HandlerMethod初始化。

???

/**
	 * 扫描ApplicationContext中的Bean,查找并注册 handlerMethod
	 */
	protected void initHandlerMethods() {
		if (logger.isDebugEnabled()) {
			logger.debug("Looking for request mappings in application context: " + getApplicationContext());
		}
		//从ApplicationContext中获取所有Bean名称
		String[] beanNames = (this.detectHandlerMethodsInAncestorContexts ?
				BeanFactoryUtils.beanNamesForTypeIncludingAncestors(getApplicationContext(), Object.class) :
				getApplicationContext().getBeanNamesForType(Object.class));
		//遍历Bean
		for (String name : beanNames) {
			if (!name.startsWith(SCOPED_TARGET_NAME_PREFIX) && isHandler(getApplicationContext().getType(name))) {
				//从bean中查找handler method
				detectHandlerMethods(name);
			}
		}
		//handler method 初始化
		handlerMethodsInitialized(getHandlerMethods());
	}

?

/**
	 * 从一个Handler中查找 handler method
	 */
	protected void detectHandlerMethods(final Object handler) {
		Class<?> handlerType =
				(handler instanceof String ? getApplicationContext().getType((String) handler) : handler.getClass());

		
		final Map<Method, T> mappings = new IdentityHashMap<Method, T>();
		//获取Class
		final Class<?> userType = ClassUtils.getUserClass(handlerType);

		Set<Method> methods = HandlerMethodSelector.selectMethods(userType, new MethodFilter() {
			@Override
			public boolean matches(Method method) {
				T mapping = getMappingForMethod(method, userType);
				if (mapping != null) {
					mappings.put(method, mapping);
					return true;
				}
				else {
					return false;
				}
			}
		});
		//遍历所有handler method,并注册
		for (Method method : methods) {
			registerHandlerMethod(handler, method, mappings.get(method));
		}
	}

?isHandler 在RequestMappingHandlerMapping 具体实现

	/**
	 * {@inheritDoc}
	 * Expects a handler to have a type-level @{@link Controller} annotation.
	 */
	@Override
	protected boolean isHandler(Class<?> beanType) {
		return ((AnnotationUtils.findAnnotation(beanType, Controller.class) != null) ||
				(AnnotationUtils.findAnnotation(beanType, RequestMapping.class) != null));
	}

?

Spring MVC之HandlerMap 初始化(RequestmappingHandlerMapping)

原文:http://wujiu.iteye.com/blog/2284564

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!