写点什么

Spring、Spring MVC、Spring Boot 三者的关系还傻傻分不清楚?

作者:三十而立
  • 2023-03-25
    湖南
  • 本文字数:2837 字

    阅读完需:约 9 分钟

在本文中,你将获取到有关于 Spring,Spring MVC 和 Spring Boot 的概述,了解他们解决的问题以及最佳的应用位置。最重要的是 Spring,Spring MVC 和 Spring Boot 不会矛盾。他们很好的解决了不同的问题。1.Spring 框架解决的核心问题是什么?


好好想想,Spring Framework 解决了什么问题?


Spring Framework 最重要的特性是依赖注入


所有 Spring 模块的核心是依赖注入或 IOC 控制反转


为什么这很重要?因为,当正确使用 DI 或 IOC 时,我们可以开发松耦合的应用程序。松耦合的应用程序可以很方便进行单元测试。


举个简单的例子。2.没有依赖注入的示例


请考虑以下示例: WelcomeController 依赖于 WelcomeService 来获取 欢迎消息。它是如何获取 WelcomeService 实例的?


它正在创建它的一个实例,这意味着他们紧密相连。例如:如果我在 WelcomeController 的单元测试中为 WelcomeService 创建一个模拟器,我如何使用模 mock 创建 WelcomeController?没那么简单!


3.相同的示例使用依赖注入


依赖注入使世界看起来更简单。 SpringFramework 为你做了很多艰难的工作。我们只使用两个简单的注解: @Component 和 @Autowired。


使用 @Component 告诉 SpringFramework:这是一个你需要管理的 bean。 使用 @Autowired 告诉 SpringFramework:找到这个特定类型的正确匹配并自动装配它。 在下面的示例中, Spring 框架将为 WelcomeService 创建一个 bean,并将其自动装入 WelcomeController。 在单元测试中,我可以要求 Spring 框架将 WelcomeService 的模拟自动连接到 WelcomeController。( SpringBoot 使用 @MockBean 可以很容易地做到这一点。但是,这是另外一件事了!)


3.Spring Framework 还能解决什么问题?


3.2.问题 1:减少样板代码


Spring Framework 停止了依赖注入?不。许多 Spring 模块建立在依赖注入的核心概念之上:


Spring JDBCSpring MVCSpring AOPSpring ORMSpring JMSSpring Test
复制代码


仔细想想 SpringJMS 和 SpringJDBC。 这些模块是否带来了任何新功能?并没有!我们可以使用 J2EE 或 JavaEE 完成所有这些工作。那么,它们带来了什么?它们带来了简单的抽象。这些抽象的目的是为了:


减少样版代码/减少重复促进解耦/增加单元可测试性
复制代码


例如,与传统的 JDBC 或 JMS 相比,使用 JDBCTemplate 或 JMSTemplate 所需的代码要少得多。


3.2.问题 2:与其他框架的良好集成


SpringFramework 的优点在于它不会尝试解决已经解决的问题。它所做的就是提供与框架的完美集成,从而提供出色的解决方案。


Hibernate for ORMiBatis for Object MappingJUnit和Mockito进行单元测试
复制代码


4.Spring MVC 框架解决的核心问题是什么?


Spring MVC Framewrok 提供了开发 Web 应用程序的分离方式。使用 Dispatcher Servlet,ModelAndView,View Resolver 等概念,可以轻松开发 Web 应用程序 5.我们为什么需要 springboot?


基于 Spring 的应用程序有很多配置。当我们使用 SpringMVC 时,我们需要配置组件扫描( component scan), dispatcher servlet,视图解析器( ViewResolver), Webjar(用于提供静态内容)等。


下面的代码片段显示了 Web 应用程序中调度程序 servlet 的典型配置。


当我们使用 Hibernate/JPA 时,我们需要配置数据源(datasource),实体管理器工厂(entity manager factory),事务管理器(transaction manager)等众多其他事物。


5.1.问题 1: SpringBoot 自动配置:我们能有不同的想法吗?


SpringBoot 带来了一个全新的思维过程:


我们能在这方面思考更深入吗?


当 spring mvc jar 被添加到应用程序中时,我们可以自动配置一些 bean 吗?


如果 Hibernatejar 在 classpath 上,自动配置数据源怎么样?


如果 SpringMVC jar 在 classpath 上,那么自动配置 DispatcherServlet 怎么样? 这将有规定会覆盖默认的自动配置。


Spring Boot 查看应用的 CLASSPATH 已存在的配置,基于这些,SpringBoot 提供应用程序中框架所需要的这些基本配置。


这被称为自动装配(Auto Configuration)


5.2.问题 2: SpringBootStarter 项目:围绕众所周知的模式构建


假设我们想开发一个 Web 应用程序。


首先,我们需要确定我们想要使用的框架,使用哪些框架版本以及如何将它们连接在一起。所有 Web 应用程序都有类似的需求。下面列出了我们在 Spring MVC 课程中使用的一些依赖项。这些包括 SpringMVC, JacksonDatabind(用于数据绑定), Hibernate-Validator(用于使用 JavaValidationAPI 的服务器端验证)和 Log4j(用于日志记录)。在创建此课程时,我们必须选择所有这些框架的兼容版本。


以下是 SpringBoot 文档中关于 starter 的内容.


starter 是一组方便的依赖关系描述符,你可以在应用程序中包含这些描述符。可以获得所需的所有 Spring 和相关技术的一站式服务,而无需搜索示例代码并复制粘贴依赖。例如,如果你想使用 Spring 和 JPA 进行数据库访问只需在项目中包含 spring-boot-starter-data-jpa 依赖项就行了


让我们考虑一个示例 starter: SpringBootStarterWeb。


如果您想开发 Web 应用程序或应用程序来公开 restful 服务, SpringBootStartWeb 是首选。使用 SpringInitializr 创建一个使用 SpringBootStarterWeb 的快速项目。 SpringBootStarterWeb 的依赖关系


<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>


以下截图显示了应用程序中不同依赖项:


依赖关系可分为:


Spring:核心,bean,context,aopWeb MVC :( Spring MVC)JackSon:用于JSON绑定Validation:Hibernate验证器,验证API嵌入式Servlet容器:TomcatLogging:logback,slf4j
复制代码


任何典型的 Web 应用程序都将使用所有这些依赖项。 SpringBootStarterWeb 预装了这些。作为开发人员,我不需要担心这些依赖项或它们的兼容版本。6.Spring Boot Starter 项目选项


正如我们从 SpringBootStarterWeb 中看到的那样,入门项目帮助我们快速开始开发特定类型的应用程序。


spring-boot-starter-web-services:SOAP Web服务spring-boot-starter-web:Web和RESTful应用程序spring-boot-starter-test:单元测试和集成测试spring-boot-starter-jdbc:传统的JDBCspring-boot-starter-hateoas:为您的服务添加HATEOAS功能spring-boot-starter-security:使用Spring Security进行身份验证和授权spring-boot-starter-data-jpa:带有Hibernate的Spring Data JPAspring-boot-starter-cache:启用Spring Framework的缓存支持spring-boot-starter-data-rest:使用Spring Data REST公开简单REST服务
复制代码


7.Spring Boot 的其他目标


一些技术性的 starter:


spring-boot-starter-actuator:使用开箱即用的监控和跟踪等高级功能spring-boot-starter-undertow,spring-boot-starter-jetty,spring-boot-starter-tomcat:选择特定的嵌入式Servlet容器spring-boot-starter-logging:用于使用logback进行日志记录spring-boot-starter-log4j2:使用Log4j2进行日志记录
复制代码


SpringBoot 旨在快速实现生产就绪应用程序。


Actuator:启用高级监控和跟踪应用程序。嵌入式服务器集成:由于服务器已集成到应用程序中,因此我需要在服务器上安装单独的应用程序服务器。默认错误处理 
复制代码


用户头像

三十而立

关注

还未添加个人签名 2023-02-06 加入

还未添加个人简介

评论

发布
暂无评论
Spring、Spring MVC、Spring Boot三者的关系还傻傻分不清楚?_Java_三十而立_InfoQ写作社区