关于spring-mvc:Spring-MVC-到-Spring-Boot-的简化之路

45次阅读

共计 7907 个字符,预计需要花费 20 分钟才能阅读完成。

背景

从 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 时,咱们能够使利用失去解耦。咱们来看一个简略的例子:

没有依赖注入的例子:

@RestController
public class WelcomeController {private WelcomeService service = new WelcomeService();

    @RequestMapping("/welcome")
    public String welcome() {return service.retrieveWelcomeMessage();
    }
}

WelcomeService service = new WelcomeService(); 意味着 WelcomeController 类与 WelcomeService 类紧密结合在一起,耦合度高。复制代码

应用依赖注入的例子:

@Component
public class WelcomeService {//Bla Bla Bla}

@RestController
public 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 的简化之路到此结束。

正文完
 0