目录
Web
开发的核心内容主要包括嵌入的
Servlet
容器和
SpringMVC。
开发文档:
Web开发支持
Spring Boot
为
Web
开发提供了
spring-boot-starter-web
启动器作为基本支持,为我们提供了嵌入的
Tomcat
以及
Spring MVC
的依赖支持。(参考:
pom.xml
)
这是spring-boot-starter-web依赖中的。
SpringBoot提供了很多不同场景的自动配置类,让我们只需要在配置文件中指定少量的配置即可启动项目。自动配置
类存储在
spring-boot-autoconfifigure.jar
的
org.springframework.boot.autoconfifigure
包下。
自动配置类举例:
1 xxxxAutoConfifiguration :向容器中添加自动配置组件。
2 xxxxProperties :使用自动配置类 来封装 配置文件的内容。
SpringMVC
配置
:
WebMvcAutoConfifiguration
和
WebMvcProperties
内嵌
Servlet
容器
:
ServletWebServerFactoryAutoConfifiguration
和
ServerProperties
静态资源的映射规则
项目中的静态资源映射规则,可通过分析 WebMvcAutoConfifiguration 自动配置类得到。
webjars 资源映射
在 WebMvcAuotConfifiguration.addResourceHandlers() 分析webjars 资源映射 。
- 可以看到如果请求是/webjars/**,就去 classpath:/META-INF/resources/webjars/ 目录找对应资源文件。
- 你可以以jar包的方式引入静态资源,webjars官网: https://www.webjars.org/。
- 在官网打开资源文件的依赖配置信息,然后粘贴到 pom.xml 中。
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.3.1</version>
</dependency>
其他静态资源映射
点进去可以发现:
于是我们发现,/**的静态映射会找以上四个文件夹。
总结
:
当接受到
/**
请求访问资源时
,
会被映射到下面
4
个 类路径下的静态资源目录中查找。
例如:
访问
localhost:8080/style.css
会在上面四个静态资源路径 中查找文件。
欢迎页映射
在 WebMvcAuotConfifiguration.welcomePageHandlerMapping() 分析 欢迎页映射
在此我们发现,查找的路径是,那四个静态资源路径加 “/”路径。
分析后
,
会从
4
个静态资源目录
+
根路径
/
中 查找
index.html
页面
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public/
- /: 当前项目根路径下
会在 静态资源目录下 与 根路径查找 (按该顺序) index.html页面; 收到 "/**" 请求映射。
访问
localhost:8080/
会在上面
5
个目录中查找
index.html
页面
(
因为
/
也属于
/** )。
图标映射
Spring Boot
会在静态资源目录下 与 根路径
(
按该顺序
)
查找
faicon.ico
页面;
如果存在这样的文件,
Spring Boot
会自动将其设置为应用图标。同上。
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public/
- /: 当前项目根路径下
springboot热部署
- 在 Spring Boot 开发环境下禁用模板缓存
#开发环境下关闭thymeleaf模板缓存,thymeleaf默认是开启状态
spring.thymeleaf.cache=false
- 添加 Spring Boot Devtools 热部署依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
- Intellij IEDA和Eclipse不同,Intellij IDEA必须做一些小调整: 在 Eclipse 中,修改文件后要手动进行保存,它就会自动编译,就触发热部署现象。 在Intellij IEDA 中,修改文件后都是自动保存,默认不会自动编译文件, 需要手动编译按 Ctrl + F9 (推荐使用)或 Build -> Build Project ;
分析 SpringMVC 自动配置
Spring Boot
为
Spring MVC
提供了适用于多数应用的自动配置功能(
WebMvcAutoConfifiguration
)。
在
Spring
默认基础上,自动配置添加了以下特性:
引入ContentNegotiatingViewResolver 和
BeanNameViewResolver
beans.
自动配置了视图解析器
ViewResolver
(根据方法返回值获取视图对象
View
,视图对象决定如何渲染?重定向Or
转发)
ContentNegotiatingViewResolver
:
组合所有的视图解析器的(通过源码可分析出)
自定义视图解析器:可以
@Bean
向容器中添加一个我们自定义的视图解析器,即可被容器管理使用
public class MyViewResolver implements ViewResolver {
@Override
public View resolveViewName(String viewName, Locale locale) throws Exception {
return null;
}
}
@Configuration
public class MyConfiguration {
@Bean
public ViewResolver myViewSolver() {
System.out.println("自定义视图解析器!");
return new MyViewResolver();
}
}
也可从容器获取视图解析器代码处打断点看的更准确。
其他比如:
- Converter:转换器; 如: 文本类型转换目标类型, true 转 boolean类。
- GenericConverter:转换器,Spring内部在注册时,会将Converter先转换为GenericConverter之后再统一对GenericConverter注册。
- Formatter:格式化器;如: 2017/12/17 格式化 Date类型。
- 对 HttpMessageConverters 的支持。SpringMVC 用它来转换Http请求和响应的;User _json User _xml可以通过@Bean向容器中添加一个我们自定义 HttpMessageConverters ,即可被容器管理使用。
- 自动注册 MessageCodesResolver 。 定义错误代码生成规则。
- 自动注册 ConfifigurableWebBindingInitializer 。初始化所有 Web数据绑定器 对象, 比如 请求数据 ——》JavaBean
- 对静态资源的支持,包括对 Webjars 的支持。
- 对静态首页 index.html 的支持。
- 对 自定义 Favicon 图标的支持。
详细内容可以参考官方文档:
扩展 SpringMVC 功能
如果想保留
Spring Boot MVC
的特性,而且还想扩展新的功能(拦截器
,
格式化器
,
视图控制器等),你可以在你自
定义的
WebMvcConfifigurer
类上增加
@Confifiguration
注解。
首先我们看一看扩展功能:
@Configuration
public class MySpringMvcConfigurer implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// 发送/login来到login.html页面
registry.addViewController("/login").setViewName("login");
}
}
分析:
点进去
点进去
全面控制 SpringMVC
如果你想全面控制
SpringMVC
(也就是不使用默认配置功能)
,
你在自定义的
Web
配置类上添加
@Confifiguration
和
@EnableWebMvc 注解。
为什么添加了@EnableWebMvc 就能完全接管?
分析:
这个注解意思是容器里面没有WebMvcConfigurationSupport组件的时候,WebMvcAutoConfiguration类才生效。
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
那么逻辑就清晰了,我们自己写的配置类,如果加入@EnableWebMvc注解,就意味着我们自己写的就是WebMvcConfigurationSupport组件,springboot检查到我们写了WebMvcConfigurationSupport组件,就不在有WebMvcAutoConfiguration的自动配置了。
总结 SpringMVC 配置
- 在Spring Boot中自已配置组件的时候,先看容器中有没有公司自已配置的(@Bean、@Component),如果有就用公司自已配置的; 如果没有,才自动配置。
- 在Spring Boot中会有非常多的xxxConfifigurer帮助我们进行扩展配置。
- 在Spring Boot中会有很多的xxxCustomizer帮助我们进行定制配置。