最近再看VUE跟cloud,今天回头记录一下当时学习的spring boot的热部署及fastjson相关内容。
有关spring boot其他内容请看分类内容。
先说简单的热部署。
spring boot热部署有两种方式。
springloaded及devtools。
第一种springloaded没仔细研究,因为启动时好像需要配maven,maven启动,比较麻烦。
我这里直接使用第二种方式,devtools。配置即可使用。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<!-- 默认为false,依赖会被继承。为true依赖不会被继承。依赖于此boot项目的项目需要重新添加此依赖 -->
<optional>true</optional>
</dependency>
原理:使用devtools在启动项目时,会使用两个classLoader。一个base classLoader,用于加载不会经常改变的依赖包。 一个restart classLoader,用于加载自己编写的类。每当IDE执行save操作后,都会丢弃掉原先的restart classloader,重新new 一个restart classloader来运行我们编写的内容。因为不需要加载jar包文件,所以重启速度相当之快,这样就完成了一次热部署操作。
日常开发时,需要注意的就是代码减少使用save的频率,不然你代码还再报错执行save就热部署了。导致报错。而且电脑性能不好的偶尔卡顿。
再说一下现在流行的json解析框架 fastjson。
至于怎么快啊,怎么好啊,怎么不好啊就不多说了。写一下fastjson能带给我的东西。
先说配置依赖:
<!-- json解析框架:fastjson依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.29</version>
</dependency>
然后配置fastjson没记错也是两种方式。我就使用一种配置了。
使启动类继承WebMvcConfigurerAdapter类。并重写configureMessageConverters方法
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
/**
* 配置spring boot使用 fastjson解析框架
*/
//先定义一个fastJsonHttpMessageConverte转换消息的对象
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//添加fastJson的配置信息,比如是否需要格式化返回的JSON数据
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//解决fastJson中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<MediaType>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setSupportedMediaTypes(fastMediaTypes);
//在fastJsonHttpMessageConverter添加fastJson的配置信息
fastConverter.setFastJsonConfig(fastJsonConfig);
//将fastJsonHttpMessageConverter添加到converters当中
converters.add(fastConverter);
}
这里多说一句,之前我在学习时网上查找资料,都是没有解决中文乱码的。这里找了一个解决中文乱码问题的配置,目前看是效果是没问题的。
使用fastjson给我带来的便利有这么几个:
1,我们在定义一个bean时,有时候需要重写他的toString方法,这时候需要去拼字符串。比较麻烦。这里可以直接使用fastjson的方法转成json格式。并且支持json标准格式输出。还有排序。简单方便。
fastjson给bean中的属性排序:
@JSONField(ordinal=1)
private int id;
@JSONField(ordinal=2)
private String name;
fastjson重写toString方法:
/**
* 使用fastjson输出JSON格式的bean
* JSONObject.toJSONString有两个方法,一个是一个参数,实体;
* 另一个是两个参数,第二个参数为是否输出JSON标准格式。
*/
public String toString() {
return JSONObject.toJSONString(this,true);
}
2,日期类格式化。以前我们的一个日期格式需要用一个很长的代码去格式化成yyyy-mm-dd,现在使用fastjson就可以直接转换格式了。
@JSONField(format="yyyy-MM-dd")
用于日期类型的属性上。
3,可以很方便的把几乎所有类型转换成json格式。不仅返回页面,使用json数组形式的接口传输数据也方便很多。
下面写几个例子:
/**
* 初始化测试数据
*/
Map<String, List<String>> map = new HashMap<String, List<String>>();
List<String> list1 = new ArrayList<String>();
list1.add("小明");
list1.add(null);
List<String> list2 = new ArrayList<String>();
list2.add("张三");
list2.add("李四");
map.put("小孩", list1);
map.put("大人", null);
/**
* 反序列化时,设置autoType白名单
*/
ParserConfig.getGlobalInstance().addAccept("com.wm.springboot");
/**
* 测试list->json格式
* toJSONString(要转换的对象,是否需要JSON标准格式化)
* list反序列化:JSON.parseArray(JSON字符串,list泛型反射)
*/
String testFastJsonForList = JSONObject.toJSONString(list1,true);
System.out.println("testFastJsonForList:"+testFastJsonForList);
List<String> listparse = JSON.parseArray(testFastJsonForList,String.class);
for(String a :listparse) {
System.out.println(a);
}
/**
* 测试map->json格式,
* JSONObject.toJSONString(转成JSON的对象,SerializerFeature.WriteMapNullValue可以输出null的对象)
* 反序列化MAP:JSON.parseObject(要反序列化的字符串,反序列化后的类型及泛型)
*/
String testFastJsonForMap = JSONObject.toJSONString(map,SerializerFeature.WriteMapNullValue);
System.out.println("testFastJsonForMap:"+testFastJsonForMap);
Map<String, Object> map2 = JSON.parseObject(testFastJsonForMap, new TypeReference<Map<String, Object>>(){});
System.out.println("map2小孩:"+map2.get("小孩"));
System.out.println("map2大人:"+map2.get("大人"));
/**
* 序列化对象
* entity->json格式;转换bean时,可以使用 SerializerFeature.WriteClassName序列化类型信息
* 这样,反序列化时,可以自动进行类型识别,不然会出现异常:java.lang.ClassCastException
*/
Dog dog = new Dog();
dog.setId(1);
dog.setBirthday(new Date());
dog.setName("酷狗");
dog.setRemarks("柯基犬");
String testFastJsonForEntity = JSONObject.toJSONString(dog,SerializerFeature.WriteClassName);
System.out.println("testFastJsonForEntity:"+testFastJsonForEntity);
Dog dog2 = (Dog) JSON.parse(testFastJsonForEntity);
System.out.println("dog2:"+dog2.toString());
/**
* 测试日期类型格式转换
*/
String testFastJsonForDate = JSONObject.toJSONStringWithDateFormat(new Date(),"yyyy-MM-dd");
System.out.println("testFastJsonForDate:"+testFastJsonForDate);
大概就这么多吧。以后有发现再补充吧。