fastJson源码目录
在上篇博客java开发工具(8)中,我们说了使用 fastJson的注解进行出参映射的方式。那么这个映射方式如何实现的呢?下面我们就通过源码去看下
一、FastJsonHttpMessageConverter
我们在上一篇博文中定义了FastJsonHttpMessageConverter,这个类的关系图如下:
最顶层的是HttpMessageConverter,有如下几个核心方法:
- canRead
- canWrite
- read
- write
上面几个方法都是做一些判断,并没有真正的做序列化,真正的调用是在方法:writeInternal中。
二、JavaBeanSerializer
最后,所有的类型的输出都会走到JavaBeanSerializer类中,在这个类的write方法中,有这么一行代码:
fieldSerializer.writeValue(serializer, propertyValue);
这个方法就是输出序列化的,我们进入看下,里面有这个一段代码:
ObjectSerializer fieldSerializer = null;
JSONField fieldAnnotation = fieldInfo.getAnnotation();
if (fieldAnnotation != null && fieldAnnotation.serializeUsing() != Void.class) {
fieldSerializer = (ObjectSerializer) fieldAnnotation.serializeUsing().newInstance();
serializeUsing = true;
}
这段代码看到,我想你应该明了了,就是获取@JsonField的注解,然后反序列化的代码。
关于调用链,这里就没有必要写明了,你知道了开始进入的地方,也知道了,获取注解的地方,我想足够了。
三、总结
在这段调用中,扩展性最高的就是通过Spring的接口HttpMessageConverter的canRead,canWrite,read,write的四个方法去实践的,也充分体现了Spring的高扩展性。而这些高扩展性是通过哪些设计原则和设计模式实现的呢?是我们需要思考一下的
- Spring通过基于接口编程的原则,让用户可以自定义HttpMessageConverter放到项目中
- fastJson通过实现Spring定义的接口去扩展反序列化的方式。