知识储备:SpringBoot中SpringMVC自动配置原理

1.建议

在了解SpringBoot中SpringMVC自动配置原理之前,请先熟悉SpringBoot自动配置原理,这样再来看SpringMVC自动配置原理会简单得多,https://blog.csdn.net/qq_36625757/article/details/83929287这篇博客有详细介绍SpringBoot自动配置原理,欢迎查阅。

2.SpringMVC自动配置原理

1.https://docs.spring.io/spring-boot/docs/2.0.5.RELEASE/reference/htmlsingle/#boot-features-developing-web-applications在SpringBoot的官方文档中有介绍SpringMVC自动配置原理

2.Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.首先SpringBoot自动配置了 ContentNegotiatingViewResolver BeanNameViewResolver ,即ViewResolver(视图解析器),根据方法返回值得到视图对象(view),视图对象决定如何渲染(转发或重定向.....),我们进入到WebMvcAutoConfiguration中,这里有通过@Bean向容器中添加一个ContentNegotiatingViewResolver组件

进入到ContentNegotiatingViewResolver中,看它是如何解析视图的

通过getCandidateViews(viewName, locale, requestedMediaTypes);获得候选视图,进入其中

发现是在循环所有的视图解析器,依次解析,所有WebMvcAutoConfiguration这个视图解析器就是在组合所有视图解析器,如果我们添加了自己的视图解析器,WebMvcAutoConfiguration就会将添加的视图解析器组合进来。

3.Support for serving static resources, including support for WebJars (covered later in this document)).静态资源文件夹及webjars

4.Automatic registration of ConverterGenericConverter, and Formatter beans.,自动注册了Converter,GenericConverter,Formatter

Converter:转换器,页面提交文本类型的数据,经过转换器转为对象中的类型,例如:Integer,boolean等......

Formatter:格式化器,将页面提交的数据转为对应的格式,例如:2018-07-01----->Date 

源码中可以看出,从beanFactory获得类型为Converter,GenericConverter,Formatter的组件添加到格式化注册中心中,所有我们自己也可以添加格式化器和控制器到容器中

5.Support for HttpMessageConverters (covered later in this document).配置HttpMessageConverters 功能,HttpMessageConverters 即消息转换器,是SpringMVC中转换Http请求及响应的,例如:将User对象转换为Json返回

WebMvcAutoConfigurationAdapter就只有一个有参构造器,所以在创建WebMvcAutoConfigurationAdapter对象时,就会将HttpMessageConverters传入,即HttpMessageConverters是从容器中确定的,进入到HttpMessageConverters中发现,他也是通过有参构造器从容器中获得HttpMessageConverter

所有我们也可以将自己的HttpMessageConverter添加到容器中,官方文档也有介绍

6.Automatic registration of MessageCodesResolver (covered later in this document).定义错误代码生成规则

7.Static index.html support.静态首页访问

8.Custom Favicon support (covered later in this document),favicon.ico

9.Automatic use of a ConfigurableWebBindingInitializer bean (covered later in this document).也是通过beanFactory获得,所以我们自己也可以配置一个ConfigurableWebBindingInitializer Tina及到容器中

如果beanFactory中不存在,就通过父类获取,通过注释可以知道他是初始化web数据绑定器的,就是将请求数据绑定在controller的对象中

当然,SpringMVC的自动配置还有很多,在spring-boot-autoconfigure-2.0.6.RELEASE.jar的org.springframework.boot.autoconfigure.web包下还有很多的自动配置类

3.扩展SpringMVC

1.编写一个配置类,这个配置类的类型为WebMvcConfigurer,并且不能标注@EnableWebMvc,既保留原有配置,也加入了我们自己的配置

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

//使用WebMvcConfigurer扩展MVC功能
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

	@Override
	public void addViewControllers(ViewControllerRegistry registry) {
		//浏览器发送/peng请求也来到success页面
		registry.addViewController("/peng").setViewName("success");
	}
	
}

原理,来到WebMvcAutoConfiguration中,这个会SpringMVC的自动配置类

发现其中有一个内部类,也是实现类WebMvcConfigurer,在类头上有加上@Import(EnableWebMvcConfiguration.class),即在做其他自动配置是会导入EnableWebMvcConfiguration,进入到EnableWebMvcConfiguration及其父类中

父类中通过@Autowired(required = false)从容器中获得所有的WebMvcConfigurer,在之后的其他方法中通过获得所有的WebMvcConfigurer,循环调用方法(以addViewControllers为例),所以我们自己配置的及SpringBoot配置的WebMvcConfigurer都会一起起作用

4.全面接管SpringMVC

即SpringBoot对SpringMVC配置就不需要了,所有都是我们自己配置,只需要在配置类上加一个@EnableWebMvc注解(不推荐使用)

那么,为啥加一个@EnableWebMvc自动配置就失效了呢?进入其中,发现导入一个DelegatingWebMvcConfiguration

进入到DelegatingWebMvcConfiguration,发现他是WebMvcConfigurationSupport的子类

但在WebMvcAutoConfiguration中明确指出,当容器中不存在WebMvcConfigurationSupport的时候,这个配置才生效

也就是EnableWebMvc导入了WebMvcConfigurationSupport导入进来了,所以SpringBoot对SpringMVC的自动配置类WebMvcAutoConfiguration就失效了,WebMvcConfigurationSupport只是导入了SpringMVC最基本的配置

5.如何修改SpringMVC自动配置

1.SpringBoot在自动配置很多组件时,都会先看容器中有没有用户自己配置的相关组件,如果有就用用户自己配置的,如果没有就自动配置,如果有些组件可以有多个,就会将用户配置的和它自己默认配置的组合起来(例如:ViewResolver)

2.在SpringBoot中会有很多的xxxConfigurer,帮助我们进行扩展配置,所以要留心xxxConfigurer

非常感谢您的提问,以下是我的回答: 1. Spring Boot的自动配置原理: Spring Boot的自动配置是基于条件注解实现的。Spring Boot会根据classpath的jar包、类、属性等信息,来决定是否需要给容器添加配置类。如果需要添加,则会根据条件自动配置底层框架,如Tomcat、Redis、MySQL等。如果不需要添加,则不会添加。 2. Spring Boot导入其他的配置文件: Spring Boot可以通过在application.properties或application.yml文件添加spring.config.import属性来导入其他的配置文件。例如,可以添加以下内容来导入另一个配置文件: ``` spring.config.import=classpath:/another-config.yml ``` 3. Spring Boot的核心注解: Spring Boot的核心注解包括@SpringBootApplication、@Configuration、@EnableAutoConfiguration和@ComponentScan。其@SpringBootApplication是一个复合注解,包含了@Configuration、@EnableAutoConfiguration和@ComponentScan注解的功能。 4. Spring Boot的实现: Spring Boot的实现基于Spring框架,它使用了大量的注解来简化配置。它还使用了条件注解来根据不同条件自动配置底层框架。另外,Spring Boot还提供了很多starter包,可以让开发人员更加方便快速地搭建应用程序。 5. Spring Boot和Spring MVC的区别: Spring Boot是一个快速构建基于Spring的应用程序的框架,它使用了很多注解来简化配置。而Spring MVC是一个基于MVC架构的Web应用程序框架,它是Spring框架的一部分。Spring Boot可以使用Spring MVC来构建Web应用程序,但是它还可以用于构建其他类型的应用程序。 6. Spring Boot如何跨域请求: Spring Boot可以通过添加一个跨域请求的过滤器来实现跨域请求。具体来说,可以创建一个类实现javax.servlet.Filter接口,然后在类上添加@WebFilter注解,并设置urlPatterns属性来指定需要跨域请求的URL。在过滤器实现的doFilter方法,设置Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers和Access-Control-Max-Age等跨域请求头信息即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值