spring boot 热部署及fastjson配置

最近再看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);

大概就这么多吧。以后有发现再补充吧。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值