首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >springboot 和 springmvc 的关系

springboot 和 springmvc 的关系

原创
作者头像
用户1142828
修改2024-12-11 22:24:33
修改2024-12-11 22:24:33
6110
举报

Spring 框架家族的基础:IOC 和 AOP

  1. IOC(控制反转) 提供依赖注入容器,用于管理和注入对象依赖关系。
  2. AOP(面向切面编程) 提供横切关注点的处理,例如日志记录和事务管理。
  3. Spring 作为基础框架,衍生出诸多模块和工具(如 Spring MVC、Spring Boot)。

Spring MVC 的角色

  1. 功能:Spring MVC 是一个基于 Servlet 的轻量级 MVC 框架,专注于解决 Web 应用开发中的问题。
    • 提供 URL 路由模板引擎支持静态资源处理 等。
    • 核心组件包括:
      • DispatcherServlet:请求的分发与调度。
      • ModelAndView:封装模型和视图。
      • ViewResolver:解析视图并生成最终输出。
  2. 手动配置的复杂性
    • Spring MVC 配置需要大量 XML 或 JavaConfig,增加了开发负担。

Spring Boot 的创新

  1. 核心目标:简化 Spring 框架的配置流程,提升开发体验。
  2. 自动配置
    • 根据项目依赖,自动完成配置(例如集成数据库、消息队列等)。
    • 支持 "约定优于配置" 的理念,只需少量代码即可完成复杂配置。
  3. 特性
    • 内置 Tomcat 等 Servlet 容器,无需单独部署 WAR 文件。
    • 提供 Starter 模块,快速整合常见依赖(如 Spring Data、Spring Security)。
    • 支持开箱即用的三方库(Jackson、MongoDB、Redis 等)。
  4. 与 Spring MVC 的关系
    • Spring Boot 不取代 Spring MVC,而是为其提供快速集成和开发支持。
    • 使用 Spring Boot 后,Spring MVC 的使用流程和功能保持一致,但配置更加简单。
    • 例如,Spring Boot 可以通过自动配置完成 Spring MVC 的基本设置,如静态资源路径、内容协商等。

Spring MVC 的自动配置

Spring Boot 针对 Spring MVC 提供了开箱即用的功能扩展:

  1. 视图解析
    • 自动注册 ContentNegotiatingViewResolverBeanNameViewResolver
    • 支持静态文件(index.html)、WebJars、Favicon 等。
  2. HTTP 消息转换
    • 默认配置了多种 HttpMessageConverters(支持 JSON、XML)。
    • 可以自定义消息转换器以适配特定需求。
  3. 国际化支持
    • 自动配置 MessageCodeResolver
  4. 静态资源
    • 默认静态资源路径包括 /static/public 等。
    • 支持缓存清除策略(例如版本哈希)和 WebJars 动态加载。
  5. 模板引擎集成
    • 提供对多种模板引擎的支持(Thymeleaf、FreeMarker 等)。

传统 SpringMVC 的配置

在没有 Spring Boot 的情况下,SpringMVC 的典型配置包括以下几个部分:

1.1 配置 web.xml

传统 SpringMVC 需要在 web.xml 中配置 DispatcherServlet 和其他初始化组件:

代码语言:xml
复制
<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>
1.2 配置 SpringMVC 的 XML 文件

spring-mvc-config.xml 文件中,需要配置以下内容:

  • 组件扫描
代码语言:xml
复制
  <context:component-scan base-package="com.example.controller" />
  • 视图解析器
代码语言:xml
复制
  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
  </bean>
  • 静态资源处理
代码语言:xml
复制
  <mvc:resources mapping="/static/**" location="/static/" />
1.3 手动配置其他功能

例如,数据转换、国际化、多部分文件上传等功能,都需要显式配置相关的 Bean。


Spring Boot 如何自动配置 SpringMVC

Spring Boot 提供了自动装配机制,极大地简化了上述配置过程。以下是 Spring Boot 自动配置的具体原理和实现。

2.1 自动装配的触发

Spring Boot 自动装配 SpringMVC 的关键在于:

  1. @SpringBootApplication 启动注解
    • @SpringBootApplication 包含了 @EnableAutoConfiguration,它会自动加载所有的自动配置类。
  2. WebMvcAutoConfiguration
    • Spring Boot 提供的 WebMvcAutoConfiguration 类是实现 SpringMVC 自动配置的核心。
2.2 自动装配的实现机制
  1. 自动注册 DispatcherServlet
    • 在传统配置中,我们需要手动在 web.xml 配置 DispatcherServlet
    • Spring Boot 通过 ServletRegistrationBean 自动注册了 DispatcherServlet,并默认将其映射到根路径 /
代码语言:java
复制
   @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,并设置默认的视图前缀和后缀。
代码语言:java
复制
   @Bean
   public InternalResourceViewResolver defaultViewResolver() {
       InternalResourceViewResolver resolver = new InternalResourceViewResolver();
       resolver.setPrefix("/templates/");
       resolver.setSuffix(".jsp");
       return resolver;
   }

3.自动处理静态资源

  • Spring Boot 自动将 classpath:/static/classpath:/public/ 等目录下的资源映射到 /static/**
  • ResourceHandlerRegistry 的默认配置如下:registry.addResourceHandler("/**") .addResourceLocations("classpath:/static/", "classpath:/public/");

4.全局配置和默认行为

  • 默认支持内容协商(Content Negotiation),可以根据请求的 Accept 头返回 JSON、XML 等格式的响应。
  • 自动配置日期格式、消息转换器、异常处理等。
2.3 条件加载与自定义

Spring Boot 的自动装配是有条件的,开发者也可以轻松覆盖默认配置:

  • 条件加载的实现: 自动装配类上使用了 @Conditional 注解。例如:@ConditionalOnClass({DispatcherServlet.class, WebMvcConfigurer.class}) public class WebMvcAutoConfiguration { ... }只有当类路径中存在 DispatcherServlet 时,自动装配才会生效。
  • 自定义配置: 开发者可以通过以下方式覆盖默认行为:undefined 1. 创建一个自定义的 @Configuration 类,并实现 WebMvcConfigurer 接口。 2. 手动定义所需的 Bean,Spring Boot 会优先使用显式定义的 Bean,而不是默认的配置。

为什么 Spring Boot 不需要配置?

通过上述分析可以看出,Spring Boot 的自动装配机制免去了手动配置的繁琐步骤。原因总结如下:

  1. 默认约定:Spring Boot 提供了一系列合理的默认配置(例如默认的视图解析器和静态资源映射)。undefined4. 实际代码示例
  2. 自动装配类WebMvcAutoConfiguration 等自动装配类根据项目依赖和环境条件动态装配功能。
  3. 灵活覆盖:如果默认配置不满足需求,开发者可以通过显式声明 Bean 来覆盖默认行为。
  4. 内置嵌入式容器:Spring Boot 提供嵌入式的 Tomcat/Jetty,简化了 Servlet 容器的配置。

使用 Spring Boot 的 SpringMVC,只需要以下简单的代码即可实现功能:

代码语言:java
复制
@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
  • 自动处理静态资源。
  • 配置 JSON 转换器。
  • 提供默认的异常处理。

总结

结合 Spring Boot 后,SpringMVC 的配置被自动化处理,开发者无需手动编写繁琐的 XML 或 Java 配置文件。这是通过 Spring Boot 的自动装配机制(@EnableAutoConfiguration + WebMvcAutoConfiguration)实现的。Spring Boot 的自动装配不仅减少了开发工作量,还提供了合理的默认配置,让开发者专注于业务逻辑的实现。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring 框架家族的基础:IOC 和 AOP
  • Spring MVC 的角色
  • Spring Boot 的创新
  • Spring MVC 的自动配置
  • 传统 SpringMVC 的配置
    • 1.1 配置 web.xml
    • 1.2 配置 SpringMVC 的 XML 文件
    • 1.3 手动配置其他功能
  • Spring Boot 如何自动配置 SpringMVC
    • 2.1 自动装配的触发
    • 2.2 自动装配的实现机制
    • 2.3 条件加载与自定义
  • 为什么 Spring Boot 不需要配置?
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档