Spring Boot 针对 Spring MVC 提供了开箱即用的功能扩展:
ContentNegotiatingViewResolver 和 BeanNameViewResolver。index.html)、WebJars、Favicon 等。HttpMessageConverters(支持 JSON、XML)。MessageCodeResolver。/static、/public 等。在没有 Spring Boot 的情况下,SpringMVC 的典型配置包括以下几个部分:
传统 SpringMVC 需要在 web.xml 中配置 DispatcherServlet 和其他初始化组件:
<web-app>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-mvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>在 spring-mvc-config.xml 文件中,需要配置以下内容:
<context:component-scan base-package="com.example.controller" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean> <mvc:resources mapping="/static/**" location="/static/" />例如,数据转换、国际化、多部分文件上传等功能,都需要显式配置相关的 Bean。
Spring Boot 提供了自动装配机制,极大地简化了上述配置过程。以下是 Spring Boot 自动配置的具体原理和实现。
Spring Boot 自动装配 SpringMVC 的关键在于:
@SpringBootApplication 启动注解:@SpringBootApplication 包含了 @EnableAutoConfiguration,它会自动加载所有的自动配置类。WebMvcAutoConfiguration 类:WebMvcAutoConfiguration 类是实现 SpringMVC 自动配置的核心。web.xml 配置 DispatcherServlet。ServletRegistrationBean 自动注册了 DispatcherServlet,并默认将其映射到根路径 /。 @Bean
public DispatcherServlet dispatcherServlet() {
return new DispatcherServlet();
}
@Bean
public ServletRegistrationBean<DispatcherServlet> dispatcherServletRegistration() {
ServletRegistrationBean<DispatcherServlet> registration =
new ServletRegistrationBean<>(dispatcherServlet(), "/");
registration.setName("dispatcherServlet");
return registration;
}2.自动配置视图解析器:
WebMvcAutoConfiguration 自动装配了一个 InternalResourceViewResolver,并设置默认的视图前缀和后缀。 @Bean
public InternalResourceViewResolver defaultViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/templates/");
resolver.setSuffix(".jsp");
return resolver;
}3.自动处理静态资源:
classpath:/static/、classpath:/public/ 等目录下的资源映射到 /static/**。ResourceHandlerRegistry 的默认配置如下:registry.addResourceHandler("/**")
.addResourceLocations("classpath:/static/", "classpath:/public/");4.全局配置和默认行为:
Accept 头返回 JSON、XML 等格式的响应。Spring Boot 的自动装配是有条件的,开发者也可以轻松覆盖默认配置:
@Conditional 注解。例如:@ConditionalOnClass({DispatcherServlet.class, WebMvcConfigurer.class})
public class WebMvcAutoConfiguration { ... }只有当类路径中存在 DispatcherServlet 时,自动装配才会生效。@Configuration 类,并实现 WebMvcConfigurer 接口。
2. 手动定义所需的 Bean,Spring Boot 会优先使用显式定义的 Bean,而不是默认的配置。通过上述分析可以看出,Spring Boot 的自动装配机制免去了手动配置的繁琐步骤。原因总结如下:
WebMvcAutoConfiguration 等自动装配类根据项目依赖和环境条件动态装配功能。使用 Spring Boot 的 SpringMVC,只需要以下简单的代码即可实现功能:
@SpringBootApplication
public class SpringBootMvcApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootMvcApplication.class, args);
}
}
@RestController
public class HelloController {
@GetMapping("/")
public String home() {
return "Hello, Spring Boot!";
}
}无需任何 XML 配置,也无需额外的 Java 配置,Spring Boot 会自动完成以下任务:
DispatcherServlet。结合 Spring Boot 后,SpringMVC 的配置被自动化处理,开发者无需手动编写繁琐的 XML 或 Java 配置文件。这是通过 Spring Boot 的自动装配机制(@EnableAutoConfiguration + WebMvcAutoConfiguration)实现的。Spring Boot 的自动装配不仅减少了开发工作量,还提供了合理的默认配置,让开发者专注于业务逻辑的实现。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。