Spring Boot、Spring MVC、Spring:它们如何比较?

25 篇文章 0 订阅

Spring, Spring Boot, Spring MVC, 到处都是springs! 这篇优锐课优锐课学习笔记将逐步介绍应在何时何地应用这些工具。

在本文中,你将获得Spring,Spring MVC和Spring Boot的概述,了解它们可以解决什么问题以及在哪里最好地应用它们。你将学到的最重要的事情是,Spring,Spring MVC和Spring Boot不会争夺相同的空间。他们解决了不同的问题,并且很好地解决了这些问题。

本文来自国内专业IT教育学院【优锐课】。Java学习资料交流qq群:907135806,在接下来的学习如果过程中有任何疑问,欢迎进群探讨。

Spring Framework解决的核心问题是什么?

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

Spring Framework最重要的功能是依赖注入。所有Spring模块的核心是依赖注入或IOC控制反转。

为什么这很重要?因为,如果正确使用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框架完成艰苦的工作。我们只使用两个简单的注释:@Component和@Autowired。

• 使用 @Component,我们告诉Spring Framework:Hey,这是你需要管理的bean。
• 使用 @Autowired,我们告诉Spring Framework:Hey,找到此特定类型的正确匹配项并自动将其插入。

在下面的示例中,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 Framework还可以解决什么?

问题1:复制/管道代码

Spring Framework是否会因依赖注入而停止?否。它基于依赖注入的核心概念以及许多Spring模块。

• Spring JDBC
• Spring MVC
• Spring AOP
• Spring ORM
• Spring JMS
• Spring Test

思考一下Spring JMS和Spring JDBC。

这些模块是否带来任何新功能?否。我们可以使用J2EE或Java EE来完成所有这一切。那么,这些带来了什么?它们带来简单的抽象。这些抽象的目的是:

• 减少样板代码/减少重复
• 促进去耦/提高单元可测试性

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

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

Spring Framework的伟大之处在于它不会尝试解决已经解决的问题。它所做的一切就是与提供出色解决方案的框架提供良好的集成。

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

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

Spring MVC Framework提供了分离的Web应用程序开发方式。使用诸如Dispatcher Servlet,ModelAndView和View Resolver的简单概念,可以轻松开发Web应用程序。

为什么我们需要Spring Boot?

基于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的典型配置。

dispatcher org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/todo-servlet.xml 1 dispatcher /

当我们使用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为此带来了新的思维过程。

我们可以带进更多情报吗? 将spring mvc jar添加到应用程序后,我们可以自动自动配置一些bean吗?

• 如果Hibernate jar在类路径中,如何自动配置数据源?
• 如果Spring MVC jar在类路径上,如何自动配置Dispatcher Servlet?

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

Spring Boot着眼于a)CLASSPATH上可用的框架b)应用程序的现有配置。基于这些,Spring
Boot提供了使用这些框架配置应用程序所需的基本配置。这称为 Auto Configuration.

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

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

首先,我们需要确定要使用的框架,使用的框架版本以及如何将它们连接在一起。
所有Web应用程序都有类似的需求。下面列出的是我们在Spring MVC课程中使用的一些依赖项。其中包括Spring MVC,Jackson Databind(用于数据绑定),Hibernate-Validator(用于使用Java Validation API进行服务器端验证)和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>

这是Spring Boot文档中关于入门者的内容。

入门程序是一组便捷的依赖项描述符,你可以在应用程序中包括它们。你可以一站式购买所需的所有Spring和相关技术,而不必遍历示例代码并复制依赖项描述符的粘贴负载。例如,如果你想开始使用Spring和JPA进行数据库访问,只需在项目中包括spring-boot-starter-data-jpa依赖项就可以了。

让我们考虑一个示例启动器:Spring Boot Starter Web。

如果要开发Web应用程序或公开静态服务的应用程序,则可以选择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>

以下屏幕快照显示了添加到我们的应用程序中的不同依赖项在这里插入图片描述

依赖关系可分为:

• Spring: core, beans, context, aop
• Web MVC: (Spring MVC)
• Jackson: for JSON Binding
• Validation: Hibernate Validator, Validation API
• Embedded Servlet Container: Tomcat
• Logging: 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 Framework的缓存支持
• 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的目标是在快速启用生产就绪应用程序。

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

本文分享到这。
有想要JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git等Java学习资料和视频课程的童鞋也可以加vx:ddmsiqi 领取啦,共同进步~

抽丝剥茧 细说架构那些事——【优锐课】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值