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());
            }
        };
}}

成功!

相关推荐
我爱挣钱我也要早睡!2 小时前
Java 复习笔记
java·开发语言·笔记
汇能感知7 小时前
摄像头模块在运动相机中的特殊应用
经验分享·笔记·科技
阿巴Jun7 小时前
【数学】线性代数知识点总结
笔记·线性代数·矩阵
茯苓gao8 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾8 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT9 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
ST.J9 小时前
前端笔记2025
前端·javascript·css·vue.js·笔记
Suckerbin9 小时前
LAMPSecurity: CTF5靶场渗透
笔记·安全·web安全·网络安全
小憩-10 小时前
【机器学习】吴恩达机器学习笔记
人工智能·笔记·机器学习
UQI-LIUWJ10 小时前
unsloth笔记:运行&微调 gemma
人工智能·笔记·深度学习