1. Spring MVC auto-configuration(自动配置)
spring boot自动配置好了SpringMVC
以下是SpringBoot对SpringMVC的默认配置(WebMvcAutoConfiguration
)
-
Inclusion of
ContentNegotiatingViewResolver
andBeanNameViewResolver
beans.- 自动配置了
ViewResolver
(视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发?重定向?)) ContentNegotiatingViewResolver
:组合所有的视图解析器- 如何定制:我们可以自己给容器中添加一个视图解析器,spring boot自动将其组合进来;
例如在主方法中自定义ViewResolver
然后找到@Bean public ViewResolver myViewResolver(){ return new myViewResolver(); } private static class myViewResolver implements ViewResolver { @Override public View resolveViewName(String viewName, Locale locale) throws Exception { return null; } }
DispatcherSevlet
的doDispatch()
方法打断点,然后debug运行,访问资源后可以看到控制台
- 自动配置了
-
Support for serving static resources, including support for WebJars (see below).静态资源文件夹路径,webjars
-
Static
index.html
support. 静态首页访问 -
Custom
Favicon
support (see below). favicon.ico -
自动注册了 of
Converter
,GenericConverter
,Formatter
beans.-
Converter:转换器; public String hello(User user):类型转换使用Converter
-
Formatter
格式化器; 2017.12.17===Date@Bean @ConditionalOnProperty(prefix = "spring.mvc", name = "date-format")//在文件中配置日期格式化的规则 public Formatter<Date> dateFormatter() { return new DateFormatter(this.mvcProperties.getDateFormat());//日期格式化组件 }
-
自己添加的格式化器转换器,我们只需要放在容器中即可
-
Support for
HttpMessageConverters
(see below).-
HttpMessageConverter:SpringMVC用来转换Http请求和响应的;User–>Json
-
HttpMessageConverters
是从容器中确定,获取所有的HttpMessageConverter自己给容器中添加HttpMessageConverter,只需要将自己的组件注册容器中(
@Bean
,@Component
)
-
-
Automatic registration of
MessageCodesResolver
(see below).定义错误代码生成规则 -
Automatic use of a
ConfigurableWebBindingInitializer
bean (see below).我们可以配置一个ConfigurableWebBindingInitializer来替换默认的(添加到容器)
初始化WebDataBinder; 请求数据=====JavaBean;
org.springframework.boot.autoconfigure.web:web的所有自动场景
If you want to keep Spring Boot MVC features, and you just want to add additional MVC configuration (interceptors, formatters, view controllers etc.) you can add your own
@Configuration
class of typeWebMvcConfigurerAdapter
, but without@EnableWebMvc
. If you wish to provide custom instances ofRequestMappingHandlerMapping
,RequestMappingHandlerAdapter
orExceptionHandlerExceptionResolver
you can declare aWebMvcRegistrationsAdapter
instance providing such components.
If you want to take complete control of Spring MVC, you can add your own@Configuration
annotated with@EnableWebMvc
.
2. 扩展SpringMVC
以前有配置文件时我们是这样拓展的(如拦截器):
<mvc:view-controller path="/hello" view-name="success"/>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/hello"/>
<bean></bean>
</mvc:interceptor>
</mvc:interceptors>
现在我们只需编写一个配置类(@Configuration
),是WebMvcConfigurerAdapter
类型;不能标注@EnableWebMvc
2.1 栗子
既保留了所有的自动配置,也能用我们扩展的配置
@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {//使用WebMvcConfigurerAdapter来拓展SpringMVC的功能
//WebMvcConfigurerAdapter中实现了很多空方法,我们根据需求进行重写即可
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//浏览器发送 /mvc 请求来到 success
registry.addViewController("/mvc").setViewName("success");
}
}
2.2 原理
- WebMvcAutoConfiguration是SpringMVC的自动配置类
- 做其他自动配置时会导入
@Import(EnableWebMvcConfiguration.class)
@Configuration public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration { private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite(); //从容器中获取所有的WebMvcConfigurer @Autowired(required = false) public void setConfigurers(List<WebMvcConfigurer> configurers) { if (!CollectionUtils.isEmpty(configurers)) { this.configurers.addWebMvcConfigurers(configurers); //一个参考实现;将所有的WebMvcConfigurer相关配置都来一起调用; @Override //public void addViewControllers(ViewControllerRegistry registry) { // for (WebMvcConfigurer delegate : this.delegates) { // delegate.addViewControllers(registry); // } } } }
- 容器中所有的WebMvcConfigurer都会一起起作用
- 我们的配置类也会被调用
即:SpringMVC的自动配置和我们的扩展配置都会起作用
3. 全面接管SpringMVC
全面接管SpringMVC即SpringBoot对SpringMVC的自动配置都不需要了,都由我们自己配置(所有的SpringMVC的自动配置都失效了)
我们只需在配置类中添加@EnableWebMvc
即可
3.1 原理
为什么加上@EnableWebMvc
,自动配置就失效了?
-
@EnableWebMvc的核心
@Import(DelegatingWebMvcConfiguration.class) public @interface EnableWebMvc { }
-
进入被导入的类,可以看到
@Configuration(proxyBeanMethods = false) public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
-
WebMvcAutoConfiguration
@Configuration @ConditionalOnWebApplication @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurerAdapter.class }) //容器中没有这个组件的时候,这个自动配置类才生效 @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10) @AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, ValidationAutoConfiguration.class }) public class WebMvcAutoConfiguration {
-
@EnableWebMvc
将WebMvcConfigurationSupport
组件导入进来 -
导入的
WebMvcConfigurationSupport
只是SpringMVC最基本的功能
4. 如何修改SpringBoot的默认配置
4.1 过程
-
SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(
@Bean
、@Component
)如果有就用用户配置的,如果没有,才自动配置;如果有些组件可以有多个(ViewResolver)将用户配置的和自己默认的组合起来; -
在SpringBoot中会有非常多的`xxxConfigurer帮助我们进行扩展配置
-
在SpringBoot中会有很多的`xxxCustomizer帮助我们进行定制配置
5. 热部署
在最后我们再介绍一下热部署;在项目的开发过程中我们会对业务代码进行不断地修改测试,但是在修改后需要重启项目和服务,这种重复性操作会降低我们的开发效率。因此Spring Boot框架提供了热部署的依赖启动器,我们添加该依赖后,修改代码后就无需再重启项目啦
5.1 实现步骤
- 添加依赖
<!--热部署依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
- IDEA热部署设置
在IDEA工具界面中进入File-Setting-Build,Execution,Deployment-Compiler,勾选Build project automatically,点击apply
在项目任意界面按 “Ctrl+Shift+Alt+/” 打开Maintenance选项框,点击Registry,在列表中勾选“compiler.automake.allow.when.app.running”,即可开启热部署啦~
该SpringBoot学习笔记学习自雷神前辈,是对知识点的整理和自我认识的梳理,如有不当之处,欢迎指出