springboot系列8,SpringBoot下的Spring MVC
在SpringBoot时代,规约大于配置,对于Spring MVC简化分为几点:
完全自动装配:用户不再需要手动配置那么多实现接口
条件装配:例如@xxxConditional
外部化配置:不用多说了
完全自动装配
- DispatcherServlet:DispatcherServletAutoConfiguration
源码中,首先会根据条件生成一个servlet
将上面生成的servlet进行注册
需要注意的是,注册的返回值类型为ServletRegistrationBean,通过源码往上追溯,有一个ServletContextInitializer接口,也就是说,这里的方式跟WebApplicationInitializer是类似的。
- 替换@EnableWebMvc:WebMvcAutoConfiguration
之前在配置mvc的类的时候,需要@EnableWebMvc,springboot时代用WebMvcAutoConfiguration代替,关于@EnableWebMvc我们之前说过,他有关于mapping、adapter的定义。再看WebMvcAutoConfiguration源码,里面会有关于adapter的自动装配的类,
- Servlet容器:ServletWebServerFactoryAutoConfiguration
在ServletWebServerFactoryAutoConfiguration中,自动配置了一个DispatcherServletAutoConfiguration类,
追溯发现,会引入一个ServletWebServerFactoryAutoConfiguration类,而这个类的作用就是初始化不同类型servlet容器。
条件装配
web类型判断:servlet
在application中说过,有三中类型,非web、web Servlet、web Ractive,这里需要判断是不是servlet,具体实现见下面
API依赖:servlet、Spring Web MVC
Bean依赖:WebMvcConfigurationSupport
从之前文章可以知道,@EnableWebMvc就属于条件装配,看@EnableWebMvc源码并追溯发现,@EnableWebMvc引入的类会继承WebMvcConfigurationSupport,而在WebMvcAutoConfiguration类中,会发现@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)的注解,意思是如果WebMvcConfigurationSupport这个Bean存在的时候,这个类下面所有的都不会去装载,也就是说如果@EnableWebMvc存在的时候,AutoConfiguration是不会自动加载的。
再提一嘴,上图第二行就是对于servlet的类型判断。
外部化配置
Web MVC配置:WebMvcProperties
资源配置:ResourceProperties
关于springboot下的配置顺序,可分为两种:
绝对顺序:@AutoConfigureOrder
相对顺序:@AutoConfigureAfter
绝对顺序就是第几位,相对顺序,意思就是在括号里写的那几个配置加载完成之后,才会加载这个配置。
建一个mvc项目
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>demo</artifactId>
<groupId>com.haozi</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springboot-webmvc</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- jsp的配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
/**
* springboot mvc引导类
*/
@SpringBootApplication(scanBasePackages = "com.haozi.web")
public class SpringBootWebMvcBootstrap {
public static void main(String[] args) {
SpringApplication.run(SpringBootWebMvcBootstrap.class);
}
}
/**
* Spring Mvc配置类
*/
@Configuration
//自动化配置,这个注解必须去掉,原因之前说过
//@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
//这个配置通过配置文件配置
// @Bean
// public ViewResolver viewResolver(){
// InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
// internalResourceViewResolver.setViewClass(JstlView.class);
// internalResourceViewResolver.setPrefix("/WEB-INF/jsp/");
// internalResourceViewResolver.setSuffix(".jsp");
// return internalResourceViewResolver;
// }
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截中。。。");
return true;
}
});
}
}
@Controller
public class HelloWorldController {
@RequestMapping("")
public String index(@RequestParam int value) {
return "index";
}
}
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
关于配置文件的内容,上面外部化配置说过,mvc的配置是WebMvcProperties,打开发现关键词是spring.mvc
通过搜索可以找到spring-configuration-metadata.json这个文件,会发现
从view里也可以看出,是关于prefix和suffix的配置的,因此关键词就是name。
上一篇: vscode配置c和c++环境(极简)
下一篇: 洛谷P1304题题解(Java语言描述)