Java最全爆破专栏丨SpringBoot2(17),2024Java大厂面试经验分享

架构学习资料

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

   protected final void addDefaultHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
        StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
        stringConverter.setWriteAcceptCharset(false);

        messageConverters.add(new ByteArrayHttpMessageConverter());
        messageConverters.add(stringConverter);
        messageConverters.add(new ResourceHttpMessageConverter());
        messageConverters.add(new SourceHttpMessageConverter<Source>());
        messageConverters.add(new AllEncompassingFormHttpMessageConverter());

        if (romePresent) {
            messageConverters.add(new AtomFeedHttpMessageConverter());
            messageConverters.add(new RssChannelHttpMessageConverter());
        }

        if (jackson2XmlPresent) {
            ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.xml().applicationContext(this.applicationContext).build();
            messageConverters.add(new MappingJackson2XmlHttpMessageConverter(objectMapper));
        }
        else if (jaxb2Present) {
            messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
        }

        if (jackson2Present) {
            ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().applicationContext(this.applicationContext).build();
            messageConverters.add(new MappingJackson2HttpMessageConverter(objectMapper));
        }
        else if (gsonPresent) {
            messageConverters.add(new GsonHttpMessageConverter());
        }
    }

从源码中可以看到,SpringMVC中使用Jackson库或Gson库来转换json字符串,使用使用Jackson XML或者JAXB2来转换XML。

而如果我们没有配置自己的 MessageConverter,SpringMVC启动时就会调用 addDefaultHttpMessageConverters()方法。

图片

4. SpringBoot中自定义HttpMessageConverters的实现思路

如果我们想在SpringBoot中自定义自己的HttpMessageConverters该怎么办呢?这时候,我们可以使用HttpMessageConverters添加HttpMessageConverter原生转换类或自定义转换类,如下所示:

  import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
import org.springframework.context.annotation.*;
import org.springframework.http.converter.*;

@Configuration
public class MyConfiguration {

    @Bean
    public HttpMessageConverters customConverters() {
        HttpMessageConverter<?> additional = ...
        HttpMessageConverter<?> another = ...
        return new HttpMessageConverters(additional, another);
    }
}

从上面的代码示例中,我们看到,可以把HttpMessageConverter类添加到converters列表中,通过这种方式来覆盖默认的转换器列表(converters)。

5. 自定义消息转换器的方式

我们可以自定义自己的消息转换器来满足特定的需求,一般自定义消息转换器有两种方式:

  • 1. 使用Spring或者第三方提供的现成的HttpMessageConverter;
  • 2. 自己重写一个HttpMessageConverter。

三.使用FastJsonHttpMessageConverter替换默认的转换器

接下来 壹哥 就通过一个案例,利用FastJsonHttpMessageConverter来替换掉默认的消息转换器。

1. 创建SpringBoot项目

我们在之前的基础上,新建一个模块demo10,并将其改造为SpringBoot项目。

图片

2. 添加FastJson依赖

在SpringBoot项目中,当我们在控制器类或者其内部的方法上添加@RestController注解和@ResponseBody注解后,默认会使用jackson插件来返回json格式的数据,但是我们也可以利用fastjson为我们提供的FastJsonHttpMessageConverter来返回json格式的数据。所以这里首先引入fastjson的依赖包。

 <dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.61</version>
</dependency>

3. 配置FastJsonHttpMessageConverter

我们可以通过实现WebMvcConfigurer接口,来配置FastJsonHttpMessageConverter,在Spring Boot2.0版本以后推荐使用这种方式来进行Web配置,这样不会覆盖掉Spring Boot的一些默认配置。

接下来我们在项目包中创建config包,并创建一个CustomWebMvcConfigurer类,代码结构如下图所示:

图片

CustomWebMvcConfigurer类中的内容:

/**
 *实现WebMvcConfigurer接口来配置FastJsonHttpMessageConverter,
 *Spring Boot2.0版本以后推荐使用这种方式来进行web配置,这样不会覆盖掉Spring Boot的一些默认配置.
 */
@Configuration
public class CustomWebMvcConfigurer implements WebMvcConfigurer {

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);
        converter.setFastJsonConfig(config);
        converter.setDefaultCharset(Charset.forName("UTF-8"));
        converters.add(converter);
    }

}

3.1 FastJson中的SerializerFeature简介

在FastJson配置实体时,会调用setSerializerFeatures方法配置多个过滤方式,常用的配置如下:

图片

3.2 常用的SerializerFeature释义

QuoteFieldNames,//输出key时是否使用双引号,默认为true;

UseSingleQuotes,//使用单引号而不是双引号,默认为false;

WriteMapNullValue,//是否输出值为null的字段,默认为false; 

WriteEnumUsingToString,//Enum输出name()或者original,默认为false;

UseISO8601DateFormat,//Date使用ISO8601格式输出,默认为false;

WriteNullListAsEmpty,//List字段如果为null,输出为[],而非null;

WriteNullStringAsEmpty,//字符类型字段如果为null,输出为"",而非null; 
     
WriteNullNumberAsZero,//数值字段如果为null,输出为0,而非null;

WriteNullBooleanAsFalse,//Boolean字段如果为null,输出为false,而非null;

SkipTransientField,//如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true;

SortField,//按字段名称排序后输出,默认为false;

@Deprecated
WriteTabAsSpecial,//把\t做转义输出,默认为false;

PrettyFormat,//结果是否格式化,默认为false;

WriteClassName,//序列化时写入类型信息,默认为false,反序列化是需用到;

DisableCircularReferenceDetect,//消除对同一对象循环引用的问题,默认为false;

WriteSlashAsSpecial,//对斜杠'/'进行转义;

BrowserCompatible,//将中文都会序列化为\uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false;

WriteDateUseDateFormat,//全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";JSON.toJSONString(obj,SerializerFeature.WriteDateUseDateFormat);

DisableCheckSpecialChar,//一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性,默认为false.

4. 创建对象实体

然后我们再创建一个“com.yyg.boot.domain”包,在这里创建一个User实体类。

package com.yyg.boot.domain;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class User {

    private String name;

    private String address;

}

5. 创建Controller

再创建一个“com.yyg.boot.web”包,在里面创建Controller类,定义一个”/users“接口。

package com.yyg.boot.web;

import com.yyg.boot.domain.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
public class UserController {

    @RequestMapping(value = "/users", method = RequestMethod.GET)
    public Object getList() {
        List<User> list = new ArrayList<>();
        //测试字符串有null的情况
        User u1 = new User("一一哥", null);
        list.add(u1);
        return list;
    }

}

6. 创建程序入口类

最后我们在项目根目录下创建启动类。

package com.yyg.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 自定义HttpMessageConverter
 */


# 《MySql面试专题》

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/cc2a9a46e5624304ee67cbeaed80e7ad.webp?x-oss-process=image/format,png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/218ad594f2f1aaffdd7d5290095880bb.webp?x-oss-process=image/format,png)

# 《MySql性能优化的21个最佳实践》

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/51d107c1216ecc9fc455fe498121786e.webp?x-oss-process=image/format,png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/d78432fe6ad58ab001eea11ed2a7f021.webp?x-oss-process=image/format,png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/0bd73155d0efb92fc13e36fdf5881b43.webp?x-oss-process=image/format,png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/f98539e05e81822892320facb05e4bc2.webp?x-oss-process=image/format,png)

# 《MySQL高级知识笔记》

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/8e02b0cdf4704d32bf9185ecbccf074f.webp?x-oss-process=image/format,png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/1494c4cfd1d474be48104c164d433477.webp?x-oss-process=image/format,png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/3c554a891c609678010c314acdf0e191.webp?x-oss-process=image/format,png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/51b27bfc51e8035a5bcebc8c7118dc8b.webp?x-oss-process=image/format,png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/de3dfa884bb15cb369eb466fcdaa759c.webp?x-oss-process=image/format,png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/4e823835cb51500d28656ccb0963c659.webp?x-oss-process=image/format,png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/1d393b40218f7ccbee326e7f83795bdf.webp?x-oss-process=image/format,png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/2bbebf238e045d720722b8bc3e53d7e5.webp?x-oss-process=image/format,png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/aa8ecbad13da0a85d2d918cb32f8fd67.webp?x-oss-process=image/format,png)

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/d4918a22e16cbadfcafcc003c86c61de.webp?x-oss-process=image/format,png)

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

![全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好](https://img-blog.csdnimg.cn/img_convert/a322ee50eda7ae6cd32315117f390e36.webp?x-oss-process=image/format,png)

**关注我,点赞本文给更多有需要的人**

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

ql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

[外链图片转存中...(img-auOIy8hO-1715352050075)]

**关注我,点赞本文给更多有需要的人**

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值