一、日志框架

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

1、每个 starter 场景,都会导入一个核心场景 spring-boot-starter。
2、核心场景引入了日志的所用功能 spring-boot-starter-logging。

在程序一启动就会使用日志框架。
如果我们想要更改配置,那么我们可以在application文件中直接修改。
如果觉得不够,我们可以写一个logback-spring.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格式

        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
        </dependency>

可以在我们要输出的类前加上该注解,但我试了不加该注解,也可以生效在这里插入图片描述
我们可以通过请求头的Accept来告知服务器我们想要的类型,这是默认可以的。
但是如果我们想要通过url请求参数来告知,就需要进行配置
在这里插入图片描述
在这里插入图片描述
默认是format我们可以修改参数名。

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

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

spring.mvc.contentnegotiation.media-types.yaml=text/yaml

spring.mvc.contentnegotiation.media-types 这些是必须的,后边是自定义的。
2、之后 我们需要导入一个支持yaml的依赖。

        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-yaml</artifactId>
        </dependency>

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

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,然后添加我们的消息转换器。

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

成功!

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部