这几天一直在研究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事务的源码分析