springboot3 一些听课笔记(1)

文章目录

  • 一、日志框架
  • [二、springboot 自动配置](#二、springboot 自动配置)
  • [三 、springweb](#三 、springweb)
    • 3.1
    • [3.2 自己编写一个messageconvert](#3.2 自己编写一个messageconvert)
      • [3.2.2 如果我们想让其支持yaml格式呢?](#3.2.2 如果我们想让其支持yaml格式呢?)

一、日志框架

springboot底层 默认使用logback+sjf4j作为日志框架。

1、每个 starter 场景,都会导入一个核心场景 spring-boot-starter。

2、核心场景引入了日志的所用功能 spring-boot-starter-logging。

在程序一启动就会使用日志框架。

如果我们想要更改配置,那么我们可以在application文件中直接修改。

如果觉得不够,我们可以写一个logback-spring.xml文件来配置。

如果我们想要使用其他日志,可以首先在依赖中排除默认框架,然后导入我们要用的日志框架。

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 如果第三方框架使用了其他日志框架,如 jul,可以排除掉这个框架的默认日志 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

我们可以在properties中配置,也可以写xml文件来进行配置
总结:

1、导入任何第三方框架,先排除它的日志包,因为 Boot 底层控制好了日志。

2、修改 application.properties 配置文件,就可以调整日志的所有行为。如果不够,可以编写日志框架自己的配置文件放在类路径下就行,比如 logback-spring.xml,log4j2-spring.xml。

3、如需对接专业日志系统,也只需要把 logback 记录的日志灌倒 kafka 之类的中间件,这和 SpringBoot 没关系,都是日志框架自己的配置,修改配置文件即可。

4、业务中使用 slf4j-api 记录日志,不要再用 System.out.println() 了

二、springboot 自动配置

自己的理解:springboot有各种启动器,如果我们配置了启动器,就会从

这里边也就是

这里找到我们要自动配置的组件。

每个自动配置类其实都会有一些属性绑定,为了给组件添加属性,比如serve-port默认是8080.

通过

可以找到属性的类,

属性的类有前缀,证明我们可以在properties文件中通过该前缀来修改属性的值。

如果是第三方的启动器,则springboot就会去找相应的jar包,比如mybatis

也会有该内容,导入我们需要的组件。然后通过属性来配置。

多理解吧,目前理解的是这样。

当我们导入依赖时,springboot管理的就会直接在

这里找相应的自动配置类,如果是第三方就会去找其jar包下的自动配置类,然后将自动配置导入,添加我们需要的bean组件,同时给bean组件需要的属性赋值。通过属性文件。

三 、springweb

3.1

如果我们想要配置自己的springmvc配置,可以采用自动,手自一体或者自动的方式。

我们加入Configration 然后继承 WebMvcConfigurer。

但是为什么继承WebMvcConfigurer 就能实现配置呢?

自动配置类中有一个这个类,主要是它会把所有的Webconfigure添加进去。把方法加进去。其实底层还是调用WebMvcConfigurer 的相应方法。

3.2 自己编写一个messageconvert

中间媒介默认是支持json的

我们可以导入xml依赖,则也可以支持xml格式

xml 复制代码
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
        </dependency>

可以在我们要输出的类前加上该注解,但我试了不加该注解,也可以生效

我们可以通过请求头的Accept来告知服务器我们想要的类型,这是默认可以的。

但是如果我们想要通过url请求参数来告知,就需要进行配置

默认是format我们可以修改参数名。

3.2.2 如果我们想让其支持yaml格式呢?

1、首先,我们需要告知springboot我们新增了一个协商类型,在配置文件中

xml 复制代码
spring.mvc.contentnegotiation.media-types.yaml=text/yaml

spring.mvc.contentnegotiation.media-types 这些是必须的,后边是自定义的。

2、之后 我们需要导入一个支持yaml的依赖。

xml 复制代码
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-yaml</artifactId>
        </dependency>

3、编写一个我们自己的MessageConvert(示例写法)

java 复制代码
package com.cku.demo.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.stereotype.Controller;

import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;

/**
 * @ClassName MyyamlHttpMessageConvet
 * @Description TODO
 * @Author lukcy
 * @Date 2024/6/5 15:06
 * @Version 1.0
 */
@Configuration
public class MyyamlHttpMessageConvet extends AbstractHttpMessageConverter {
    private ObjectMapper objectMapper = null; //把对象转成yaml

    public MyyamlHttpMessageConvet(){
        //告诉SpringBoot这个MessageConverter支持哪种媒体类型  //媒体类型
        super(new MediaType("text", "yaml", Charset.forName("UTF-8")));
        YAMLFactory factory = new YAMLFactory()
                .disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER);
        this.objectMapper = new ObjectMapper(factory);
    }

    @Override//哪个类可以支持该消息转换
    protected boolean supports(Class clazz) {
        return true;
    }

    @Override//requestBody 时使用
    protected Object readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        return null;
    }

    @Override//responseBody 时使用
    protected void writeInternal(Object methodRetuenValue, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        try(OutputStream body = outputMessage.getBody()){
           this.objectMapper.writeValue(body,methodRetuenValue);
        }
    }
}

4、由于WebMvcConfigurer 可以帮我们添加一个配置 我们导入一个WebMvcConfigurer,然后添加我们的消息转换器。

java 复制代码
package com.cku.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

/**
 * @ClassName Myconfig
 * @Description TODO
 * @Author lukcy
 * @Date 2024/6/5 15:15
 * @Version 1.0
 */
@Configuration
public class Myconfig {
    @Bean
    public WebMvcConfigurer webMvcConfigurer(){
        return new WebMvcConfigurer() {
            @Override //配置一个能把对象转为yaml的messageConverter
            public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
                converters.add(new MyyamlHttpMessageConvet());
            }
        };
}}

成功!

相关推荐
CXDNW2 分钟前
【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0
网络·笔记·http·面试·https·http2.0
使者大牙2 分钟前
【大语言模型学习笔记】第一篇:LLM大规模语言模型介绍
笔记·学习·语言模型
ssf-yasuo15 分钟前
SPIRE: Semantic Prompt-Driven Image Restoration 论文阅读笔记
论文阅读·笔记·prompt
ajsbxi27 分钟前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
TeYiToKu1 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
dsywws1 小时前
Linux学习笔记之时间日期和查找和解压缩指令
linux·笔记·学习
cuisidong19973 小时前
5G学习笔记三之物理层、数据链路层、RRC层协议
笔记·学习·5g
乌恩大侠3 小时前
5G周边知识笔记
笔记·5g
咔叽布吉4 小时前
【论文阅读笔记】CamoFormer: Masked Separable Attention for Camouflaged Object Detection
论文阅读·笔记·目标检测
johnny2334 小时前
《大模型应用开发极简入门》笔记
笔记·chatgpt