Spring Boot、Spring MVC、Spring对比

Spring Boot、Spring MVC、Spring中都有spring这个单词,让咱们来看看你应该在哪儿、什么时候使用这些工具。java

在本文,你将鸟瞰Spring、Spring MVC和Spring Boot,了解它们都处理哪些问题,它们最佳应用场景。你将认识到最重要的一点是,它们不是在同一个领域内竞争,它们都在各自的领域很出色地处理问题。web

1.Spring框架处理的核心问题是什么?

好好想一想,Spring框架处理的是什么问题?其实,Spring框架最核心的特性就是依赖注入(DI,Dependency Injection)。在全部的Spring模块中,最核心的部分都是依赖注入或者叫控制反转(IOC,Inversion of Control)。spring

为何依赖注入和控制反转如此重要?由于,经过正确地使用依赖注入和控制反转,咱们能够开发出松耦合的应用程序,而后松耦合的应用程序能够很容易地进行单元测试。
让咱们来考虑一个小例子:sql

1.没有依赖注入的例子

考虑下面的例子:WelcomeController依赖WelcomeService去得到欢迎信息(welcome message),WelcomeController要怎么去获取WelcomeService实例呢?spring-mvc

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

上面的方式,经过WelcomeService service = new WelcomeService();,WelcomeController建立了一个WelcomeService实例,可是它们被牢牢耦合了。例如,若是我想要对WelcomeController进行单元测试,而且mock WelcomeService,我要怎么让WelcomeController使用mock对象呢?不容易!tomcat

2.有依赖注入的例子

有依赖注入的世界简单多了,让Spring框架来作艰苦的工做。咱们只须要使用两个简单的注解:@Component@Autowiredrestful

  • 使用@Component,咱们是在告诉Spring框架:嘿,这是个须要你管理的bean。
  • 使用@Autowired,咱们是在告诉Spring框架:嘿,给我找到一个最匹配这儿的类型自动装配进来。

在下面的例子中,Spring框架将为WelcomeService建立一个bean,而且自动注入到WelcomeController中。
在单元测试中,我能够要求Spring框架给WelcomeController自动装配一个WelcomeService的mock对象。(Spring Boot经过@MockBean注解让这件事情更容易,不过那又是另一码事了。)mvc

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

2.Spring框架还处理什么问题?

问题1:重复代码、样板代码

Spring止步于依赖注入了?不,它在依赖注入的概念上构建了不少其它的Spring模块:app

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

考虑一下Spring JMS和Spring JDBC。这些模块引入了什么新功能么?并无!咱们能够经过J2EE或者Java EE来完成这些全部工做。那么,这些模块引入了什么?它们引入简单的抽象(simple abstractions)。这些抽象的目的是:框架

  • 减小样板代码/重复代码
  • 推崇解耦合/更易于单元测试

例如,和传统的JDBC和JMS比起来,你只须要写很是少的代码来使用JDBCTemplate或者JMSTemplate。

问题2:和其它框架更好地集成

Spring框架的伟大之处在于,它没有尝试去解决已经解决的问题。它所作的是,集成一些优秀框架:

  • 集成Hibernate来作ORM
  • 集成iBatis(MyBatis)来作对象映射
  • 集成JUnit和Mockito来作单元测试

3.Spring MVC框架主要解决什么问题?

Spring MVC框架为开发web应用提供了解耦合方式。经过简单的概念,如Dispatcher Servlet、ModelAndView和View Resolver,它使得开发web应用变得很简单。

4.咱们为何还须要Spring Boot呢?

基于Spring的应用有不少配置。当咱们使用Spring MVC的时候,咱们须要配置组件扫描component scan、请求分发器dispatcher servlet、一个视图解析器view resolver、web jars(用于存放静态资源)等其它事情。

<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应用中配置dispatcher 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的时候,咱们须要配置一个数据源datasource,一个实体类管理工厂(entity manager factory),一个事务管理器(transaction manager):

<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在classpath下,怎么自动配置一个DataSource?
  • 若是Spring MVC jar在classpath下,怎么自动配置一个DispatcherServlet?

还应该提供一种能够覆盖自动配置的方式。

Spring Boot经过查看
a)classpath下的可用的框架
b)应用已有的配置
来提供一些须要为集成了这些框架的应用提供一些基础配置,也叫作Auto Configuration(自动配置)。

问题#2.Spring Boot起步工程:创建在众所周知的模式上

好比咱们须要开发一个web应用。
首先,咱们须要明确咱们想使用什么框架,使用哪一个版本的框架,怎么将它们链接在一块儿。
全部的web应用都有相似的需求。下面列举了一些在Spring MVC中会使用到的依赖:

<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 MVC,Jackson Databind,Hibernate-Validator和Log4j。当开发Spring MVC应用的时候,咱们须要选择这些框架的兼容版本。

下面是Spring Boot官方文档关于starters(起步依赖)的描述:

Starters是一系列能够在应用中很方便地使用的依赖描述。你能够得到你须要的全部Spring及其相关的技术的一站式服务,不须要去寻找、拷贝别的工程的依赖。例如,若是你想使用Spring和JPA来作数据访问,只须要在项目中引入spring-boot-starter-data-jpa依赖便可。

让咱们看看一个起步依赖的例子:Spring Boot Starter Web。
若是你想要开发一个web应用,或者一个须要暴露restful服务的应用,Spring Boot Starter Web能够拿来用用。咱们能够经过使用Spring Initializer来快速建立一个使用了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项目中能够看到,starter工程让咱们开发特定类型的应用更快速。还有以下的starter工程可供选择:

  • spring-boot-starter-web-services: SOAP Web Services
  • spring-boot-starter-web: Web and RESTful applications
  • spring-boot-starter-test: Unit testing and Integration Testing
  • spring-boot-starter-jdbc: Traditional JDBC
  • spring-boot-starter-hateoas: Add HATEOAS features to your services
  • spring-boot-starter-security: Authentication and Authorization using Spring Security
  • spring-boot-starter-data-jpa: Spring Data JPA with Hibernate
  • spring-boot-starter-cache: Enabling Spring Framework’s caching support
  • spring-boot-starter-data-rest: Expose Simple REST Services using Spring Data REST

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记录日志。

原文连接:https://dzone.com/articles/spring-boot-vs-spring-mvc-vs-spring-how-do-they-compare