天天看点

spring及spring mvc源码透彻解析

这几天一直在研究spring的源码,现将研究过程和成果记录一下,以便以后查看。

一、从spring加载的入口

二、阅读《spring源码深入解析》一书,并结合博客 【Spring源码分析】Bean加载流程概览 及这篇博客的后续几篇,再根踪spring的源码,理解了spring初始化beanFactory,加载并解析bean配置为BeanDefinition,后又实例化bean的过程

三、阅读《spring源码深入解析》一书,再根据springmvc的源码,理解了springmvc xml配置的执行过程

四、【Spring实战】----Spring配置文件的解析 及【Spring实战】Spring注解配置工作原理源码解析还有其他的关于注解的基本知识,大概了解了spring的注解。

spring启动component-scan类扫描加载过程---源码分析 中了解了在实例化bean时调用了DefaultBeanDefinitionDocumentReader类的registerBeanDefinitions方法,其调用的delegate.parseCustomElement(ele)方法,会调用NamespaceHandlerSupport的parse方法,它会根据节点的类型,找到一种合适的解析BeanDefinitionParser(如mvc:annotation-driven对应的AnnotationDrivenBeanDefinitionParser)对标签的内容进行实例化。

要查找某个标签的parser就根据就选择NamespaceHandlerSupport使用ctrl+H,从其子类中找到标签对应的Handler,在从Handler中找到对应的parser,如mvc:annotation-driven,就找MvcNamespaceHandler,可以看到annotation-driven对应的中AnnotationDrivenBeanDefinitionParser。

五、SpringMVC源码之参数解析绑定原理 、 SpringMVC源码阅读:Controller中参数解析了解了springmvc参数解析的流程。

RequestMappingHandlerAdapter解析参数需要的解析器都是在afterPropertiesSet方法中初始化的,所以了解了afterPropertiesSet()是在bean实例化后执行的,doCreateBean()中initializeBean()的invokeInitMethods()中,会调用bean的afterPropertiesSet()方法。

<mvc:annotation-driven
		ignore-default-model-on-redirect="true">
		<mvc:message-converters register-defaults="true">
			<bean id="mappingJacksonHttpMessageConverter"
				  class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" >
				<property name="supportedMediaTypes">
					<list>
						<value>text/html;charset=UTF-8</value>
						<value>application/json;charset=UTF-8</value>
					</list>
				</property>
				<property name="objectMapper">
					<bean class="com.tqmall.web.converter.CustomObjectMapper" />
				</property>
			</bean>
		</mvc:message-converters>
	</mvc:annotation-driven>
           

SpringMVC关于json、xml自动转换的原理研究[附带源码分析] 上面MappingJackson2HttpMessageConverter解析器的加载过程,annotation-driven对应的解析器AnnotationDrivenBeanDefinitionParser的parse()方法,在加载RequestMappingHandlerAdapter之前会解析标签内的message-converters的内容,并赋给RequestMappingHandlerAdapter,在后续解析参数时会用到。

六、结语

目前还没搞清楚NamespaceHandler的加载流程,后续会再添加上aop其spring事务的源码分析