springMVC源码之 HTTPMessageConverters

用fastJson代替JACKSON做为序列化工具是@Bean注解一个configuration类,返回一个new HttpMessageConverters,构造函数里是fastJson的messageConverter。

看看底层发生了什么:

applicationContext.refresh----->finishBeanFactoryInitialization(beanFactory)---->new HttpMessageConverters(),构造函数中,传入一个HttpMessageConverter集合additionalConverters也就是自定义的converter,再实现一个继承WebMvcConfigurationSupport的匿名内部类,调用WebMvcConfigurationSupport的getMessageConverters方法,获取defaultConverters,之后按照additional在前,default在后的规则,合并成一个集合

而WebMvcAutoConfiguration中的EnableWebMvcConfiguration在生成RequestMappingHandlerAdapter的时候,有adapter.setMessageConverters(getMessageConverters()),点进去delegatingWebMvcConfiguration.configureMessageConverters(this.messageConverters),this.configurers.configureMessageConverters(converters);  这里的configurers是通过set方法autowired注入的,实现了WebMvcConfigurer接口的所有类,现在里面有四个类,比较重要的一个是WebMvcAutoConfiguration的内部类WebMvcAutoConfigurationAdapter,WebMvcAutoConfigurationAdapter把自己收集的converters放到上面的传入的参数集合中,而它自己收集的converters是通过构造器自动注入进来的HttpMessageConverters里面的,看,又绕回来了,圆上了,这个HttpMessageConverters就是上面我们自定义的那个。

这也就是说,我们自定义的这个生成HttpMessageConverters的@Bean注解的方法,只能定义一次,否则就会产生多个单例的问题。当然也可以用@Primary或者 @Qualifier注解决定用哪个,不过就多次一举了。

这也解释了,为什么fastJson的converter注册了之后,能覆盖JACKSON,因为按照之前所说,fastJson在前面,而RequestMappingHandlerAdapter在处理controller方法的时候,是从前到后遍历converter的。

 

猜你喜欢

转载自www.cnblogs.com/chuliang/p/11355764.html