public void run() {
runSafely(new ConversionServiceInitializer());
runSafely(new ValidationInitializer());
//第3步 HttpMessageConverter进行了初始化
runSafely(new MessageConverterInitializer());
runSafely(new JacksonInitializer());
runSafely(new CharsetInitializer());
preinitializationComplete.countDown();
}
1、HttpMessageConverter是什么
一个使用了策略模式的接口,可以简单理解为一个接口。从http请求中解析或者将数据放入http中返回
之前默认是使用FormHttpMessageConverter,尤其是xml盛行阶段,现在都使用json格式传输数据,所以新增了支持json的类AllEncompassingFormHttpMessageConverter,作为formhttp的扩展。对于json数据的操作则使用了jackson框架,springboot自动配置中会判断类加载器中是否已经加载了jackson相关的包,判断的结果一直存放在内存中,等待MessageConverter初始化的时机开始进行对应的初始化。
//这段代码就是判断类加载器是否加载相应的类,如果已经加载过了,会对相应的标志位进行调整
static {
ClassLoader classLoader = AllEncompassingFormHttpMessageConverter.class.getClassLoader();
jaxb2Present = ClassUtils.isPresent("javax.xml.bind.Binder", classLoader);
jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) &&
ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
jackson2XmlPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", classLoader);
jackson2SmilePresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", classLoader);
gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader);
jsonbPresent = ClassUtils.isPresent("javax.json.bind.Jsonb", classLoader);
}
2、具体的初始化
2.1 SourceHttpMessageConverter初始化
它是