文章目录
- 一、日志框架
- 二、springboot 自动配置
- 三 、springweb
- 3.1
- 3.2 自己编写一个messageconvert
- 3.2.2 如果我们想让其支持yaml格式呢?
一、日志框架
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());
}
};
}}
成功!