Spring Boot vs Spring MVC vs Spring-它们如何比较?

Spring Boot vs Spring MVC vs Spring-它们如何比较?


图片

Spring,Spring Boot,Spring MVC,到处都有“ spring”一词! 让我们逐步介绍在何处以及何时可以使用这些工具。


在本文中,您将看到评论:Spring,Spring MVC和Spring Boot,了解它们可以解决什么问题以及在哪里最好地应用它们。 您了解到的最重要的事实是,Spring,Spring MVC和Spring Boot不会争夺同一位置。 他们解决了不同的问题,并且很好地解决了这些问题。

这个Spring Framework解决的主要问题是什么?


认真思考。 Spring Framework解决了什么问题?

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

让我们看一个简单的例子。

一个没有依赖注入的例子


请考虑以下示例:WelcomeController依赖WelcomeService来接收欢迎消息。 他如何获得WelcomeService的实例?

WelcomeService service = new WelcomeService(); 

此行创建此服务的实例。 这意味着它们之间有着紧密的联系。 例如,如果我在用于WelcomeController的单元测试中为WelcomeService创建了一个模拟,如何获取WelcomeController以使用该模拟? 不容易!

 @RestController public class WelcomeController { private WelcomeService service = new WelcomeService(); @RequestMapping("/welcome") public String welcome() { return service.retrieveWelcomeMessage(); } } 

简单的依赖注入示例


依赖注入使世界看起来容易得多。 您让Spring框架完成艰苦的工作。 我们仅使用两个简单的注释: ComponentAutowired

  • 使用Component ,我们说Spring框架:嘿,这是您需要管理的bin。
  • 使用Autowired ,我们说Spring框架:嗨,找到适合此特定类型的匹配项并将其插入。

在下面的示例中,Spring框架将为WelcomeService创建一个bean,并将其连接到WelcomeController。

在单元测试中,我可以要求Spring框架将WelcomeService模拟连接到WelcomeController。 (Spring Boot通过使用@MockBean注释使事情变得更容易。但这是另一个故事!)

 @Component public class WelcomeService { //Bla Bla Bla }@RestController public class WelcomeController { @Autowired private WelcomeService service; @RequestMapping("/welcome") public String welcome() { return service.retrieveWelcomeMessage(); } } 

Spring框架还能解决什么?


问题1:代码重复/污染


Spring Framework会因依赖项注入而停止吗? 不行 它基于具有多个Spring模块的依赖项注入的基本概念。

  • 春天的JDBC
  • 春季MVC
  • 春天aop
  • 春季orm
  • Spring JMS
  • 春季测试

让我们暂时讨论一下Spring JMS和Spring JDBC。

这些模块是否带来新功能? 不行 我们可以在J2EE或Java EE上完成所有这些工作。 那他们带来了什么呢? 它们带来简单的抽象。 这些抽象的目的是:

  • 减少样板代码/减少重复
  • 促进断开/扩展可测试性

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

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


Spring Framework的伟大之处在于,它并不试图解决已经解决的问题。 他所做的只是提供与其他框架的出色集成,进而提供出色的解决方案。

  • 休眠ORM
  • iBatis用于对象映射
  • JUnit和Mockito用于单元测试

为什么我们需要弹簧靴?


基于Spring的应用程序具有许多配置。

当使用Spring MVC时,我们需要配置:组件扫描,调度程序servlet,视图解析器,Web jar(用于传递静态内容)等。

 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/views/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean><mvc:resources mapping="/webjars/**" location="/webjars/"/> 

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

 <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/todo-servlet.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> 

当我们使用Hibernate / JPA时,我们需要配置数据源,实体管理器工厂,事务管理器等。

 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${db.driver}" /> <property name="jdbcUrl" value="${db.url}" /> <property name="user" value="${db.username}" /> <property name="password" value="${db.password}" /> </bean><jdbc:initialize-database data-source="dataSource"> <jdbc:script location="classpath:config/schema.sql" /> <jdbc:script location="classpath:config/data.sql" /> </jdbc:initialize-database><bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> <property name="persistenceUnitName" value="hsql_pu" /> <property name="dataSource" ref="dataSource" /> </bean><bean id="transactionManager"class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> <property name="dataSource" ref="dataSource" /> </bean><tx:annotation-driven transaction-manager="transactionManager"/> 

问题1:Spring Boot自动配置:我们可以改变看法吗?


Spring Boot围绕这一切带来了新的思维过程。

  • 如果Hibernate jar位于类路径中,那么如何自动配置数据源呢?
  • 如果Spring MVC jar位于类路径中,那么对Dispatcher Servlet的自动配置会如何?

然后将提供一些设置来覆盖默认的自动配置。

问题2:Spring Boot Starter项目:围绕着众所周知的模式构建


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

首先,我们需要确定要使用的框架,要使用的版本以及如何将它们连接在一起。

所有Web应用程序都有类似的需求。 在Spring MVC中使用以下依赖项。 这些包括Spring MVC,Jackson Databind,Hibernate-Validator和Log4j。

 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.2.2.RELEASE</version> </dependency><dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.3</version> </dependency><dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.0.2.Final</version> </dependency><dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> 

如果要开发Web应用程序或RESTful服务应用程序,则选择Spring Boot Start Web。 让我们使用Spring Initializr通过Spring Boot Starter Web快速创建一个项目。

Spring Boot Starter Web的依赖关系


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

以下屏幕快照显示了已添加到我们的应用程序中的各种依赖项。

图片

依赖关系可分为:

  • 春季:核心,bean,上下文,aop
  • Web MVC :(春季MVC)
  • Jackson:用于JSON通讯
  • 验证:Hibernate Validator,验证API
  • 嵌入式Servlet容器:Tomcat
  • 日志记录:logback,slf4j

任何典型的Web应用程序都将使用所有这些依赖项。 Spring Boot Starter Web附带了它们。 作为开发人员,我不必担心这些依赖性或兼容版本。

Spring Boot Starter项目选项


从Spring Boot Starter Web可以看到,启动程序项目帮助我们快速开始开发某些类型的应用程序。

  • spring-boot-starter-web-services:SOAP Web服务
  • spring-boot-starter-web:Web和RESTful应用程序
  • spring-boot-starter-test:单元测试和集成测试
  • spring-boot-starter-jdbc:传统JDBC
  • spring-boot-starter-hateoas:将HATEOAS功能添加到您的服务中
  • spring-boot-starter-security:使用Spring Security的身份验证和授权
  • spring-boot-starter-data-jpa:带有Hibernate的Spring Data JPA
  • spring-boot-starter-cache:启用Spring框架的缓存支持
  • spring-boot-starter-data-rest:使用Spring Data REST提供简单的REST服务

Spring Boot的其他目标


技术方面也有一些入门者:

  • 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进行记录

Spring Boot旨在创建较短的应用程序。

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

Source: https://habr.com/ru/post/zh-CN481914/


All Articles