springMVC源码之 HttpMessageConverters

如果嫌springBoot自带的序列化工具JACKSON不好,可以用fastJson代替。具体做法是用@Bean注解去注册一个HttpMessageConverters类型的bean: httpMessageConverter,其构造函数里的参数是fastJson的messageConverter。

看看底层发生了什么:HttpMessageConverters的被使用是在RequestMappingHandlerAdapter处理controller方法返回值的时候,在RequestMappingHandlerAdapter实例化的时候被收集,实例化是在WebMvcAutoConfiguration的内部类EnableWebMvcConfiguration的@Bean注解的方法,在方法中,有adapter.setMessageConverters(getMessageConverters());在getMessageConverters方法中,configureMessageConverters方法把所有WebMvcConfigurer类型的bean都收集起来,然后调用他们的configureMessageConverters方法,这些WebMvcConfigurer里面有个叫WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter的,它的构造方法中会自动注入HttpMessageConverters(HttpMessageConverters类型的bean在spring工厂本来是没有的,如果有,那就是我们自定义的),而它的configureMessageConverters方法是取出我们自定义的这个HttpMessageConverters,把里面配置的httpMessageConverter都取出来,和default的HttpMessageConverter合并到一个list中,传递给RequestMappingHandlerAdapter,而且自定义的converter先被放入list,因为RequestMappingHandlerAdapter找converter的时候是在list中从前到后找的,所以fastJson的messageConverter可以覆盖JACKSON的,

注意:HttpMessageConverters向spring工厂的注册只能一次,否则会出现注入的错误。

原文地址:https://www.cnblogs.com/chuliang/p/11355764.html