SpringMVC之分析AnnotationDrivenBeanDefinitionParser(三)
来源:互联网 发布:网络监控监控的是什么 编辑:程序博客网 时间:2024/06/11 19:01
我们在之前的文章中对这篇文章中AnnotationDrivenBeanDefinitionParser的parse方法进行了一些分析,我们在这篇文章中接着分析AnnotationDrivenBeanDefinitionParser的parse方法的内容。
ManagedList<?> messageConverters = getMessageConverters(element, source, parserContext);
private ManagedList<?> getMessageConverters(Element element, Object source, ParserContext parserContext) {//解析message-converters的标签//格式如下:/* <mvc:annotation-driven><mvc:message-converters><bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/><bean class="org.springframework.http.converter.StringHttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value><value>application/javascript;charset=UTF-8</value></list></property></bean></mvc:message-converters></mvc:annotation-driven>*/Element convertersElement = DomUtils.getChildElementByTagName(element, "message-converters");//存放自己配置的HttpMessageConverterManagedList<? super Object> messageConverters = new ManagedList<Object>();if (convertersElement != null) {messageConverters.setSource(source);//解析自己配置的HttpMessageConverter的beanfor (Element beanElement : DomUtils.getChildElementsByTagName(convertersElement, "bean", "ref")) {Object object = parserContext.getDelegate().parsePropertySubElement(beanElement, null);messageConverters.add(object);}}//如果没有配置<mvc:message-converters>或者register-defaults的值为true 默认为trueif (convertersElement == null || Boolean.valueOf(convertersElement.getAttribute("register-defaults"))) {messageConverters.setSource(source);//添加ByteArrayHttpMessageConverter的BeanDefinitionmessageConverters.add(createConverterDefinition(ByteArrayHttpMessageConverter.class, source));//添加StringHttpMessageConverter的BeanDefinitionRootBeanDefinition stringConverterDef = createConverterDefinition(StringHttpMessageConverter.class, source);stringConverterDef.getPropertyValues().add("writeAcceptCharset", false);messageConverters.add(stringConverterDef);//添加ResourceHttpMessageConverter的BeanDefinitionmessageConverters.add(createConverterDefinition(ResourceHttpMessageConverter.class, source));//添加SourceHttpMessageConverter的BeanDefinitionmessageConverters.add(createConverterDefinition(SourceHttpMessageConverter.class, source));//添加AllEncompassingFormHttpMessageConverter的BeanDefinitionmessageConverters.add(createConverterDefinition(AllEncompassingFormHttpMessageConverter.class, source));//如果有Classpath下面有 com.rometools.rome.feed.WireFeed,则添加//AtomFeedHttpMessageConverter和RssChannelHttpMessageConverter的BeanDefinitionif (romePresent) {messageConverters.add(createConverterDefinition(AtomFeedHttpMessageConverter.class, source));messageConverters.add(createConverterDefinition(RssChannelHttpMessageConverter.class, source));}//如果有Classpath下面有 com.fasterxml.jackson.dataformat.xml.XmlMapper,则添加//MappingJackson2XmlHttpMessageConverter和RssChannelHttpMessageConverter的BeanDefinitionif (jackson2XmlPresent) {RootBeanDefinition jacksonConverterDef = createConverterDefinition(MappingJackson2XmlHttpMessageConverter.class, source);//创建Jackson2ObjectMapperFactoryBean的BeanDefinitionGenericBeanDefinition jacksonFactoryDef = createObjectMapperFactoryDefinition(source);jacksonFactoryDef.getPropertyValues().add("createXmlMapper", true);jacksonConverterDef.getConstructorArgumentValues().addIndexedArgumentValue(0, jacksonFactoryDef);messageConverters.add(jacksonConverterDef);}//如果有Classpath下面有 javax.xml.bind.Binder,则添加//Jaxb2RootElementHttpMessageConverter的BeanDefinitionelse if (jaxb2Present) {messageConverters.add(createConverterDefinition(Jaxb2RootElementHttpMessageConverter.class, source));}//如果有Classpath下面有 com.fasterxml.jackson.databind.ObjectMapper和Jaxb2RootElementHttpMessageConverter的BeanDefinition,则添加//MappingJackson2HttpMessageConverter的BeanDefinitionif (jackson2Present) {RootBeanDefinition jacksonConverterDef = createConverterDefinition(MappingJackson2HttpMessageConverter.class, source);//创建Jackson2ObjectMapperFactoryBean的BeanDefinitionGenericBeanDefinition jacksonFactoryDef = createObjectMapperFactoryDefinition(source);//添加到MappingJackson2HttpMessageConverter的构造函数中jacksonConverterDef.getConstructorArgumentValues().addIndexedArgumentValue(0, jacksonFactoryDef);messageConverters.add(jacksonConverterDef);}//如果有Classpath下面有 com.google.gson.Gson,则添加//GsonHttpMessageConverter的BeanDefinitionelse if (gsonPresent) {messageConverters.add(createConverterDefinition(GsonHttpMessageConverter.class, source));}}return messageConverters;}上面的这段内容主要是添加一些自己配置的HttpMessageConverter的BeanDefinition或者是一些初始化的HttpMessageConverter的BeanDefinition
ManagedList<?> argumentResolvers = getArgumentResolvers(element, parserContext);
这一段的内容主要是获取自定义的一些参数解析器(HandlerMethodArgumentResolver的实现类)
ManagedList<?> returnValueHandlers = getReturnValueHandlers(element, parserContext);这一段是配置自定义的HandlerMethodReturnValueHandler的实现类,没什么可说的。标签如下:
<mvc:return-value-handlers> </mvc:return-value-handlers>
String asyncTimeout = getAsyncTimeout(element);RuntimeBeanReference asyncExecutor = getAsyncExecutor(element);ManagedList<?> callableInterceptors = getCallableInterceptors(element, source, parserContext);ManagedList<?> deferredResultInterceptors = getDeferredResultInterceptors(element, source, parserContext);上面这一段是配置异步的请求处理信息。
RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(RequestMappingHandlerAdapter.class);handlerAdapterDef.setSource(source);handlerAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);handlerAdapterDef.getPropertyValues().add("contentNegotiationManager", contentNegotiationManager);handlerAdapterDef.getPropertyValues().add("webBindingInitializer", bindingDef);handlerAdapterDef.getPropertyValues().add("messageConverters", messageConverters);上面这一段是创建RequestMappingHandlerAdapter的BeanDefinition。并给webBindingInitializer属性和messageConverters属性赋值,赋值的内容是前面获取的的Bean对象。
addRequestBodyAdvice(handlerAdapterDef);
protected void addRequestBodyAdvice(RootBeanDefinition beanDef) {//如果Classpath下面有com.fasterxml.jackson.databind.ObjectMapper和//com.fasterxml.jackson.core.JsonGenerator这两个类的话,则添加JsonViewRequestBodyAdvice到//requestResponseBodyAdvice集合中if (jackson2Present) {beanDef.getPropertyValues().add("requestBodyAdvice",new RootBeanDefinition(JsonViewRequestBodyAdvice.class));}}上面的这段代码中是给RequestHandlerMappingAdapter的requestResponseBodyAdvice属性中添加值。
addResponseBodyAdvice(handlerAdapterDef);
protected void addResponseBodyAdvice(RootBeanDefinition beanDef) {//如果Classpath下面有com.fasterxml.jackson.databind.ObjectMapper和//com.fasterxml.jackson.core.JsonGenerator这两个类的话,则添加JsonViewResponseBodyAdvice到//requestResponseBodyAdvice集合中if (jackson2Present) {beanDef.getPropertyValues().add("responseBodyAdvice",new RootBeanDefinition(JsonViewResponseBodyAdvice.class));}}-上面的这段代码中是给RequestHandlerMappingAdapter的requestResponseBodyAdvice属性中添加值。
if (argumentResolvers != null) {handlerAdapterDef.getPropertyValues().add("customArgumentResolvers", argumentResolvers);}if (returnValueHandlers != null) {handlerAdapterDef.getPropertyValues().add("customReturnValueHandlers", returnValueHandlers);}给RequestHandlerMappingAdapter中的customArgumentResolvers添加自定义的参数解析器。给RequestHandlerMappingAdapter中的customReturnValueHandlers添加自定义的参数返回处理器。
readerContext.getRegistry().registerBeanDefinition(HANDLER_ADAPTER_BEAN_NAME , handlerAdapterDef);将创建的RequestMappingHandlerAdapter注册到IOC容器中。bean的name为org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter。
在AnnotationDrivenBeanDefinitionParser中还添加了其他的一些Bean到IOC容器中,下面我们挑一些我们熟悉的说一下:
RootBeanDefinition exceptionHandlerExceptionResolver = new RootBeanDefinition(ExceptionHandlerExceptionResolver.class);exceptionHandlerExceptionResolver.setSource(source);exceptionHandlerExceptionResolver.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);exceptionHandlerExceptionResolver.getPropertyValues().add("contentNegotiationManager", contentNegotiationManager);exceptionHandlerExceptionResolver.getPropertyValues().add("messageConverters", messageConverters);exceptionHandlerExceptionResolver.getPropertyValues().add("order", 0);addResponseBodyAdvice(exceptionHandlerExceptionResolver);if (argumentResolvers != null) {exceptionHandlerExceptionResolver.getPropertyValues().add("customArgumentResolvers", argumentResolvers);}if (returnValueHandlers != null) {exceptionHandlerExceptionResolver.getPropertyValues().add("customReturnValueHandlers", returnValueHandlers);}添加ExceptionHandlerExceptionResolver,处理异常信息的。
RootBeanDefinition responseStatusExceptionResolver = new RootBeanDefinition(ResponseStatusExceptionResolver.class);responseStatusExceptionResolver.setSource(source);responseStatusExceptionResolver.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);responseStatusExceptionResolver.getPropertyValues().add("order", 1);String responseStatusExceptionResolverName =readerContext.registerWithGeneratedName(responseStatusExceptionResolver);异常信息的另外一种处理方式,将异常信息映射为HTTP状态码。
RootBeanDefinition defaultExceptionResolver = new RootBeanDefinition(DefaultHandlerExceptionResolver.class);defaultExceptionResolver.setSource(source);defaultExceptionResolver.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);defaultExceptionResolver.getPropertyValues().add("order", 2);String defaultExceptionResolverName =readerContext.registerWithGeneratedName(defaultExceptionResolver);
默认的异常信息解析器。这三个异常信息解析器的处理顺序是:ExceptionHandlerExceptionResolver最先,ResponseStatusExceptionResolver次之,DefaultHandlerExceptionResolver顺序为最后。
MvcNamespaceUtils.registerDefaultComponents(parserContext, source);这这一段代码总主要是添加默认的几个Bean,分别是:BeanNameUrlHandlerMapping、HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter。
阅读全文
0 0
- SpringMVC之分析AnnotationDrivenBeanDefinitionParser(三)
- SpringMVC之分析AnnotationDrivenBeanDefinitionParser(一)
- SpringMVC之分析AnnotationDrivenBeanDefinitionParser(二)
- springMVC之ContextLoaderListener分析
- SpringMVC之RequestContextHolder分析
- SpringMVC之RequestContextHolder分析
- SpringMVC之RequestContextHolder分析
- 走向大神之springMVC(三)
- 学习SpringMVC(三)之RequestParam
- springmvc----源码分析之springmvc执行流程
- SpringMVC源码分析(三)之Controller方法参数的工作原理
- SpringMVC之分析HandlerMethodReturnValueHandler(一)
- SpringMVC之分析HandlerMethodReturnValueHandler(二)
- springMVC源码分析--AbstractUrlHandlerMapping(三)
- springMVC源码分析--SimpleControllerHandlerAdapter(三)
- springMVC源码分析--AbstractUrlHandlerMapping(三)
- 一步一步学习springmvc之三:spring+springmvc+jpa+在线文本编辑
- springMVC系列之(三) spring+springMVC集成(annotation方式)
- C#调用matlab函数详细步骤和例程
- Semaphore信号量类详解
- Python数据分析之pandas学习(11/3)
- DeviceNet协议
- time_init
- SpringMVC之分析AnnotationDrivenBeanDefinitionParser(三)
- Python及Django学习错误与解决
- 加载web项目时报的错误:Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modul
- Servlet过滤器
- javaSE面试题-常用类
- 在阿里云上进行域名解析
- k-近邻算法(三)
- 我来谈谈微信小程序
- (学习java)水果超市管理系统