Spring Boot、Spring MVC、Spring中都有spring这个单词,让咱们来看看你应该在哪儿、什么时候使用这些工具。java
在本文,你将鸟瞰Spring、Spring MVC和Spring Boot,了解它们都处理哪些问题,它们最佳应用场景。你将认识到最重要的一点是,它们不是在同一个领域内竞争,它们都在各自的领域很出色地处理问题。web
好好想一想,Spring框架处理的是什么问题?其实,Spring框架最核心的特性就是依赖注入(DI,Dependency Injection)。在全部的Spring模块中,最核心的部分都是依赖注入或者叫控制反转(IOC,Inversion of Control)。spring
为何依赖注入和控制反转如此重要?由于,经过正确地使用依赖注入和控制反转,咱们能够开发出松耦合的应用程序,而后松耦合的应用程序能够很容易地进行单元测试。
让咱们来考虑一个小例子:sql
考虑下面的例子: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
有依赖注入的世界简单多了,让Spring框架来作艰苦的工做。咱们只须要使用两个简单的注解:@Component
和@Autowired
。restful
@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(); } }
Spring止步于依赖注入了?不,它在依赖注入的概念上构建了不少其它的Spring模块:app
考虑一下Spring JMS和Spring JDBC。这些模块引入了什么新功能么?并无!咱们能够经过J2EE或者Java EE来完成这些全部工做。那么,这些模块引入了什么?它们引入简单的抽象(simple abstractions)。这些抽象的目的是:框架
例如,和传统的JDBC和JMS比起来,你只须要写很是少的代码来使用JDBCTemplate或者JMSTemplate。
Spring框架的伟大之处在于,它没有尝试去解决已经解决的问题。它所作的是,集成一些优秀框架:
Spring MVC框架为开发web应用提供了解耦合方式。经过简单的概念,如Dispatcher Servlet、ModelAndView和View Resolver,它使得开发web应用变得很简单。
基于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"/>
Spring Boot提供了一种新的思考方式:咱们能够引入更多的智慧嘛?当spring mvc的jar被添加进入应用,咱们不能自动配置一些bean嘛?
还应该提供一种能够覆盖自动配置的方式。
Spring Boot经过查看
a)classpath下的可用的框架
b)应用已有的配置
来提供一些须要为集成了这些框架的应用
提供一些基础配置,也叫作Auto Configuration(自动配置)。
好比咱们须要开发一个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的工程。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
而后你能够在你的应用的依赖中看到:
依赖能够被分类为:
任何典型的web应用都将使用这些依赖。Spring Boot Starter Web提早把它们打包好了。做为一个开发者,你不用再担忧它们之间会有版本冲突了。
从Spring Boot Starter Web项目中能够看到,starter工程让咱们开发特定类型的应用更快速。还有以下的starter工程可供选择:
还有一些技术性的starter:
原文连接:https://dzone.com/articles/spring-boot-vs-spring-mvc-vs-spring-how-do-they-compare