spring boot 采用了自动转配的模式, 在使用了@configration 的内部使用了@bean 注册某些bean, 也可以继承WebMvcConfigurerAdapter 等一些spring 自动装配的父类来编写自己相应的类
spring 启动后关键的一部是加载用户自己转配的bean 采用的方法是:
org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.requestMappingHandlerAdapter()
HTML Code
1
2 3 4 5 6 7 8 9 10 |
而调用这个方法的类为:
org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration.EnableWebMvcConfiguration.requestMappingHandlerAdapter() 自动转配的加载 MessageConverter就是这个时候初始化,添加到Adapter 里面去的其中就包括系统自带的conver已经加入Jackson包之后,会加入MappingJackson2HttpMessageConverter org.springframework.http.converter.ByteArrayHttpMessageConverter@963ba3, org.springframework.http.converter.StringHttpMessageConverter@942f41, org.springframework.http.converter.StringHttpMessageConverter@4c0d7a, org.springframework.http.converter.ResourceHttpMessageConverter@119ae9a, org.springframework.http.converter.xml.SourceHttpMessageConverter@32af73, org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@168dcb5,org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@fe036b, org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@1bd3f7f, org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter@1a82bac 这些是所有的转换器 spring boot 源码是不是有问题:重复了两个转换器??? |
Java Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
@Bean
public RequestMappingHandlerAdapter requestMappingHandlerAdapter() { RequestMappingHandlerAdapter adapter = createRequestMappingHandlerAdapter(); adapter.setContentNegotiationManager(mvcContentNegotiationManager()); adapter.setMessageConverters(getMessageConverters()); adapter.setWebBindingInitializer(getConfigurableWebBindingInitializer()); adapter.setCustomArgumentResolvers(getArgumentResolvers()); adapter.setCustomReturnValueHandlers(getReturnValueHandlers()); if (jackson2Present) { adapter.setRequestBodyAdvice( Collections.<RequestBodyAdvice>singletonList( new JsonViewRequestBodyAdvice())); adapter.setResponseBodyAdvice( Collections.<ResponseBodyAdvice<?>>singletonList( new JsonViewResponseBodyAdvice())); } AsyncSupportConfigurer configurer = new AsyncSupportConfigurer(); configureAsyncSupport(configurer); if (configurer.getTaskExecutor() != null) { adapter.setTaskExecutor(configurer.getTaskExecutor()); } if (configurer.getTimeout() != null) { adapter.setAsyncRequestTimeout(configurer.getTimeout()); } adapter.setCallableInterceptors(configurer.getCallableInterceptors()); adapter.setDeferredResultInterceptors(configurer.getDeferredResultInterceptors()); return adapter; } |