背景

从Servlet技术到Spring和Spring MVC,开发Web利用变得越来越简捷。然而Spring和Spring MVC的泛滥配置有时却让人望而生畏,置信有过Spring MVC开发教训的敌人能粗浅领会到这一苦楚。因为即便是开发一个Hello-World的Web利用,都须要咱们在pom文件中导入各种依赖,编写web.xml、spring.xml、springmvc.xml配置文件等。特地是须要导入大量的jar包依赖时,咱们须要在网上查找各种jar包资源,各个jar间可能存在着各种依赖关系,这时候又得下载其依赖的jar包,有时候jar包间还存在着严格的版本要求,,所以当咱们只是想开发一个Hello-World的超简略的Web利用时,却把极大局部的工夫在花在了编写配置文件和导入jar包依赖上,极大地影响了咱们的开发效率。所以为了简化Spring繁冗的配置,Spring Boot应运而生。正如Spring Boot的名称一样,一键启动,Spring Boot提供了主动配置性能,为咱们提供了开箱即用的性能,使咱们将重心放在业务逻辑的开发上。那么Spring Boot又是怎么简化Spring MVC的呢?Spring Boot和Spring、Spring MVC间又是怎么的关系呢?Spring Boot又有什么新特点呢?接下来,让咱们走进Spring MVC 到Spring Boot的简化之路,或者你就能找到这些答案。

Spring vs Spring MVC vs Spring Boot

  • Spring Boot和Spring、Spring MVC不是竞争关系,Spring Boot使咱们更加容易应用Spring和Spring MVC

Spring FrameWork

  • Spring FrameWork解决的外围问题是什么 Spring框架的最重要个性是依赖注入,所有的Spring模块的外围都是依赖注入(DI)或管制反转(IOC)。为什么很重要呢,因为当咱们应用DI或IOC时,咱们能够使利用失去解耦。咱们来看一个简略的例子:

没有依赖注入的例子:

@RestControllerpublic class WelcomeController {    private WelcomeService service = new WelcomeService();    @RequestMapping("/welcome")    public String welcome() {        return service.retrieveWelcomeMessage();    }}WelcomeService service = new WelcomeService(); 意味着WelcomeController类与WelcomeService类紧密结合在一起,耦合度高。复制代码

应用依赖注入的例子:

@Componentpublic class WelcomeService {    //Bla Bla Bla}@RestControllerpublic class WelcomeController {    @Autowired    private WelcomeService service;    @RequestMapping("/welcome")    public String welcome() {        return service.retrieveWelcomeMessage();    }}依赖注入使世界看起来更简略,咱们让Spring 框架做了辛勤的工作:@Component:咱们通知Spring框架-嘿,这是一个你须要治理的bean@Autowired:咱们通知Spring框架-嘿,找到这个特定类型的正确匹配并主动装入它复制代码

如果感觉看完文章有所播种的话,能够关注我一下哦
知乎:秃顶之路
b站:linux亦有归途
每天都会更新咱们的公开课录播以及编程干货和大厂面经
或者间接点击链接c/c++ linux服务器开发高级架构师
来课堂上跟咱们讲师面对面交换
须要大厂面经跟学习纲要的小伙伴能够加群973961276获取

Spring 还能解决什么问题

1. 反复代码
Spring框架进行了依赖注入(DI)吗?没有,它在依赖注入(DI)的外围概念上开发了许多Spring模块:

  • Spring JDBC
  • Spring MVC
  • Spring AOP
  • Spring ORM
  • Spring Test
  • ...
    考虑一下Spring JDBC,这些模块带来了新性能吗?并没有,咱们齐全能够应用Java代码实现这些工作。那么,它们给咱们带来了什么?它们带来了简略的形象,这些简略形象的目标是:
  1. 缩小样板代码/缩小反复
  2. 促成解耦/减少单元可测性 例如:与传统的JDBC相比,咱们应用Spring JDBC须要编写的代码缩小了许多。

2. 与其余框架良好的集成
Spring框架并不尝试去解决曾经解决了的问题,它所做的所有就是提供与提供杰出解决方案的框架的完满集成。

  • Hibernate
  • IBatis
  • JUnit
  • ...

Spring MVC

  • Spring MVC框架解决的外围问题是什么 Spring MVC框架提供了开发Web利用的拆散形式。通过DispatcherServlet、ModelAndView、View Resolver等简略概念,是Web利用开发变得更加简略。

为什么须要Spring Boot

基于Spring的应用程序有很多配置。当咱们应用Spring MVC时,咱们须要配置组件扫描,调度器servlet,视图解析器等:

视图解析器配置:  <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/"/>    前端调度器的典型配置:  <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"/>复制代码

Spring Boot解决的问题

1. Spring Boot 主动配置
Spring引入了新的思维过程:咱们能够变得更加智能些吗?当一个spring mvc jar包被增加到应用程序时,咱们是否能够主动配置一些bean?

  1. 当Hibernate jar包在类门路时,主动配置数据源怎么?
  2. 当Spring MVC jar包在类门路时,主动配置Dispatcher Servlet怎么?
  • Spring Boot查看ClASSPATH上对于本应用程序须要编写配置的框架,基于这些,Spring Boot提供了这些框架的根本配置-这就是主动配置。

2. Spring Boot Starter Projects
假如咱们想开发一个Web应用程序。首先,咱们须要确定咱们想要应用的框架,应用哪个版本的框架以及如何将它们连贯在一起。所有Web应用程序都有相似的需要 上面列出的是咱们在Spring MVC中应用的一些依赖关系。这些包含Spring MVC,Jackson Databind(用于数据绑定),Hibernate-Validator(用于应用Java验证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>    复制代码
  • 什么是Starter
Starter是一套不便的依赖描述符,能够蕴含在应用程序中。你能够取得所需的所有Spring及相干技术的一站式服务,而无需搜寻示例代码并复制依赖描述符的粘贴负载。例如,如果你想开始应用Spring和JPA来拜访数据库,只需在你的我的项目中蕴含spring-boot-starter-data-jpa依赖项就好。复制代码

咱们来看Starter的一个示例 - Spring-Boot-Starter-Web

Spring-Boot-Starter-Web依赖:<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId></dependency>复制代码

以下屏幕截图显示了增加到咱们的应用程序中的不同依赖关系:

任何典型的Web应用程序都会应用所有这些依赖项.Spring Boot Starter Web事后打包了这些。作为开发人员,咱们不须要放心这些依赖关系或兼容版本。

3. Spring Boot Starter我的项目选项
正如Spring Boot Starter Web一样,Starter我的项目帮忙咱们疾速入门开发特定类型的应用程序:

  • spring-boot-starter-web-services - SOAP Web服务
  • spring-boot-starter-web - Web和RESTful应用程序
  • spring-boot-starter-test - 单元测试和集成测试
  • spring-boot-starter-data-jpa - 带有Hibernate的Spring Data JPA
  • spring-boot-starter-cache - 启用Spring Framework的缓存反对
  • ...

什么是Spring Boot 主动配置

后面曾经初步介绍过,在这里具体介绍一下。
当咱们启动Spring Boot应用程序时,咱们能够在日志中看到一些重要的音讯。

Mapping servlet: 'dispatcherServlet' to [/]Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]复制代码

下面的日志语句显示了Spring Boot Auto Configuration的行为。
一当咱们在利用中增加了Spring Boot Starter Web依赖,Spring Boot AutoConfiguration就会发现Spring MVC在类门路下,它会主动配置dispatcherServlet,一个默认的谬误页面和webjars。
如果你增加了Spring Boot DataJPA Starter依赖,Spring Boot AutoConfiguration会主动配置数据源(datasource)和实体管理器(Entity Manager)

Spring Boot Auto Configuration在哪里实现

所有的主动配置逻辑都在spring-boot-autoconfigure.jar中实现。mvc、data和其余框架的所有主动配置逻辑都存在与一个jar包中。

spring-boot-autoconfigure.jar中重要的文件是/META-INF/spring.factories,该文件;列出了在EnableAutoConfiguration key下启动的所有主动配置类。上面列出一些重要的配置类:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration,org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration,org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,复制代码

查看主动配置

关上调试日志
在application.properties关上调试日志:

logging.level.org.springframework: DEBUG复制代码

当启动程序时,会打印主动配置日志信息

总结

Spring Boot的呈现自身就是为了减低Web开发的门槛,使开发人员可能专一于业务开发,而不需浪费时间在业务开发之外,至此Spring MVC到Spring Boot的简化之路到此结束。