专栏首页Java架构师必看Spring Boot系列 – 1. 简介

Spring Boot系列 – 1. 简介

一、导览

本文主要介绍以下几部分:  1. 什么是spring Boot?  2. 为什么使用Spring Boot?  3. Spring Boot提供哪些功能?  4. Spring Boot有哪些模块?  5. 如何使用Spring Boot?  6. Spring Boot有哪些不足?

二、什么是Spring Boot?

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。  该框架使用了特定的方式(继承starter,约定优先于配置)来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。  Spring Boot并不是一个框架,从根本上将,它就是一些库的集合,maven或者gradle项目导入相应依赖即可使用Spring Boot,而且无需自行管理这些库的版本。  目前最新的稳定版本是1.4.2.RELEASE,github地址:https://github.com/spring-projects/spring-boot

三、为什么使用Spring Boot?

Spring Boot是为简化Spring项目配置而生,使用它使得jar依赖管理以及应用编译和部署更为简单。Spring Boot提供自动化配置,使用Spring Boot,你只需编写必要的代码和配置必须的属性。  使用Spring Boot,只需20行左右的代码即可生成一个基本的Spring Web应用,并且内置了tomcat,构建的fat Jar包通过Java -jar就可以直接运行。  如下特性使得Spring Boot非常契合微服务的概念,可以结合Spring Boot与Spring Cloud和Docker技术来构建微服务并部署到云端:

  • 一个可执行jar即为一个独立服务
  • 很容易加载到容器,每个服务可以在自己的容器(例如docker)中运行
  • 通过一个脚本就可以实现配置与部署,很适合云端部署,并且自动扩展也更容易

简单而言,即Spring Boot使编码更简单,使配置更简单,使部署更简单,使监控更简单。

四、Spring Boot提供哪些功能?

1.无需手动管理依赖jar包的版本

Spring boot通过spring boot starter项目管理其提供的所有依赖的版本,当升级spring boot时,这些依赖的版本也会随之升级。个人无需指定版本号,但是也可以自定义版本号覆盖springboot的默认值。每个版本的boot都有对应的base spring version,不建议明确地指定spring版本。  例如,使用maven时,只需简单的在pom中包含spring-boot-starter-web即引入了Spring MVC和Tomcat的依赖。  下面是Spring Boot在 org.springframework.boot 组下提供的一些Starters:

名称

描述

spring-boot-starter

核心Spring Boot starter,包括自动配置支持,日志和YAML

spring-boot-starter-actuator

生产准备的特性,用于帮你监控和管理应用

spring-boot-starter-web

对全栈web开发的支持,包括Tomcat和 spring-webmvc

spring-boot-starter-aop

对面向切面编程的支持,包括 spring-aop 和AspectJ

spring-boot-starter-data-jpa

对”Java持久化API”的支持,包括 spring-data-jpa , spring-orm 和Hibernate

spring-boot-starter-jdbc

对JDBC数据库的支持

spring-boot-starter-security

对 spring-security 的支持

1.1 starter poms

每个starter都包含特定的依赖集,并且都遵循统一的命名模式:spring-boot-starter-*。

如何修改依赖的版本? 1. 如果你使用Maven进行一个直接或间接继承 spring-boot-dependencies (比如 spring-boot-starter-parent )的构建,并想覆盖一个特定的第三方依赖,那你可以添加合适的 properties元素。浏览 spring-boot-dependencies POM 可以获取一个全面的属性列表。例如,想要选择一个不同的slf4j版本,你可以添加以下内容:  <properties>  <slf4j.version>1.7.5<slf4j.version>  </properties>  2. 如果你使用 <scope>import</scope>将 spring-boot-dependencies 添加到自己的 dependencyManagement 片段,那你必须自己重新定义artifact而不是覆盖属性。  ※ 每个Spring Boot发布都是基于一些特定的第三方依赖集进行设计和测试的,覆盖版本可能导致兼容性问题。

1.2 spring-boot-starter-parent提供的特性

  • 默认的编译级别是java1.6
  • source编码是UTF-8
  • 一个dependency management 区域,继承自spring-boot-dependencies POM。用户可以省略普通依赖的 <version> 标签。
  • 资源过滤 (maven中的filter)。
  • 插件配置(exec, surefile, git commit ID, shade)
  • 针对application.properties和application.yml的资源过滤。  ※ 因为默认的配置文件接受spring表达式${},因此maven的资源过滤符号被修改为@..@。可使用maven属性resource.delimiter来修改。

2.自动配置,无需xml

Spring Boot尝试根据你添加的jar依赖自动配置你的应用。例如,如果HSQLDB在类路径中,并且你没有手动配置任何db连接bean,则Spring Boot会自动配置一个内存db。  使用@EnableAutoConfiguration或者@SpringBootApplication注解,配合@Configuration注解类,即可达到自动配置的目的。  Spring Boot的这种自动配置是非侵入式的,你可以定义自己的配置或bean来替代自动配置的内容。

3.可执行jar包

Spring Boot默认将应用打包成一个可执行的jar包文件,构建成功后使用java -jar命令即可运行应用。  Java并没有提供任何标准的方式来加载jar包中内嵌的jar包。一般开发者使用影子jar技术来解决这种问题。一个影子jar只是简单的将所有jar的类打包到一个单独的超级jar包中。由此带来的问题是它很难分辨在你的应用中实际可以使用哪些库,并且多个jar文件中的同名文件也是一个问题。  Spring Boot则另辟蹊径,使用如下文件格式让你能够直接嵌套jar包: 

依赖需要放到放到内部的lib文件夹下。

Spring Boot可执行jar的原理是什么? Spring Boot用于支持加载内嵌jars的核心类是 org.springframework.boot.loader.jar.JarFile(继承  自 java.util.jar.JarFile) 。它允许你从一个标准的jar文件  或内嵌的子jar数据中加载jar内容。当首次加载的时候,每个JarEntry的位置被映射到一个偏移于外部jar的物理文件: 

上面的示例展示了如何在myapp.jar的0063处找到A.class。来自于内嵌jar的B.class实际可以在myapp.jar的3452处找到,C.class可以在3980处找到。

4.外部化配置

Spring Boot可以使用properties文件,YAML文件,环境变量,命令行参数等来外部化配置。属性值可以使用@Value注解直接注入到bean中,并通过Spring的Environment抽象或经过@ConfigurationProperties注解绑定到结构化对象来访问。  例子:  YAML配置文件内容: 

使用@Value注解注入单个属性: 

使用@ConfigurationProperties注入属性组: 

5.嵌入式servlet容器

Spring Boot的web模块内置嵌入的Tomcat, Jetty, Undertow来构建自包含的Servlet容器。web应用打包成可执行jar包时,相应的servlet 容器也会被嵌入到应用jar中。并且servlets, filters和listeners都可以通过声明为bean来被容器注册。servlet容器还可以通过外部化配置来相关定制属性,如server.port, server.session.persistence等。

6.无缝集成Spring security,Spring data, Spring Message等

Spring Boot通过stater pom来导入这些依赖,当发现相关jar在classpath中时,Spring Boot将启动相应的自动配置。例如,如果security的jar在classpath中,Spring Boot的web应用将自动启动安全限制,并且默认启动basic认证(默认用户名是user,密码在启动log里会显示)。后面教程里会演示Spring jpa,Spring DATA REST,Spring Security的集成。

7.devtools提供的开发时特性

Spring Boot的devtools模块可以为应用增加开发时(development time)特性,例如开发环境属性默认值,自动重启,LiveReload(在自愿发生变化时触发浏览器刷新),全局设置等。

7.1 开启devtools特性

pom中引入spring-boot-devtools依赖即可打开devtools特性。  developer tools在运行完整的packaged app时是自动关闭的,即若使用java –jar时会被当做生产应用。安全起见,可以在maven中增加excludeDevtools编译属性来移除jar包。

7.2 devtools的自动重启

要想在Eclipse中使用Devtools的重启功能,需要将自动编译功能打开。每次保存文件并自动编译后,devtools会检测到classpath内容的修改,并触发应用重启。重启时实际只重新加载了一部分类,因此速度会非常快。详细原理会在后面教程里介绍。

7.3 devtools的livereload

开启devtools特性的应用在启动时会启动一个livereload的server,在浏览器(如chrome,Firefox)安装livereload插件后,该插件会监测到livereload server的更新,并自动刷新页面。详细介绍会在后面教程里介绍。

8.Actuator提供的生产特性(health,metrics等)

Actuator是个机器术语,目前没有统一的翻译,可以直译为促动器或执行器,Actuator通过微小的改变就可以产生很大的移动。  Spring Boot Actuator为你的应用提供一些生产环境必需的特性,如审计(audit),健康(health)和数据采集(metrics)等。使你可以在部署应用到生产环境后,通过HTTP(需要SpringMVC),JMX甚至remote shell(SSH, Telnet)等来管理和监视应用。例如,HTTP环境下,访问 contextUrl/health 路径即可查询当前环境的磁盘空间,应用和数据库的状态等;访问contextUrl/metrics路径即可查询当前jvm的内存使用情况,线程池的状态等。

五、Spring Boot各模块介绍

Spring Boot由一些模块构成,如spring-boot, spring-boot-autoconfigure, spring-boot-starters, spring-boot-cli, spring-boot-actuator等。下面简单介绍以下各模块。

1. spring-boot

主库,为其他模块提供特性支持。包括以下内容:  SpringApplication类,提供静态方法,方便编写独立运行的Spring应用。唯一的任务是创建和刷新一个合适的Spring ApplicationContext。  嵌入式web应用,自带容器(Tomcat, Jetty等)。

2. spring-boot-autoconfigure

Spring Boot可以基于classpath下的内容配置通用应用的大部分模块。一个@EnableAutoConfiguration注解触发Spring上下文的自动配置。  自动配置尝试推测用户可能需要的bean。例如,如果H2DB在classpath中,但是用户没有配置任何db连接,那么spring-boot-autoconfigure推断用户需要一个in-memory的db,因此自动配置为用户配置(默认创建的h2db的db名为testdb, 用户名为sa,密码无)。自动配置优先级低于用户自定义的bean。

3. spring-boot-starters

starters是一系列便利的依赖描述,用户可以增加到应用中,并由此取得Spring和相关技术的 一站式配置体验,无需查看sample代码并贴来贴去。例如,若用户想要使用Spring和JPA来访问db,则只需包含spring-boot-starter-data-jpa依赖到pom中即可。

4. spring-boot-cli

Spring的命令行应用,编译和运行Groovy源码,只需极少的代码就可以运行应用,Spring CLI还可以监视文件,在它们改变时自动重新编译和重启。

5. spring-boot-actuator

spring boot actuator提供额外的自动配置,为你的应用装饰一些特性,使应用在生产环境下也可以快速部署和支持。例如,若你正在编写一个JSON web服务,该模块会提供一个服务器,安全,日志,外部化配置,管理端点(management endpoints),评审等。关闭这些内建特性,或者扩展或替代它们都很容易。

6. spring-boot-loader

Spring Boot Loader提供秘籍允许你构建可用java –jar直接运行的jar包。一般无需直接使用spring-boot-loader,而是通过Gradle或Maven插件使用。

六、如何使用Spring Boot?

1. 系统要求

默认情况下,Spring Boot 1.3.6.RELEASE 需要Java7和Spring框架4.2.7.RELEASE或以上。你可以在Java6下使用Spring Boot,不过需要添加额外配置。明确支持的构建工具是Maven(3.2+)和Gradle(1.12+)。  注:尽管你可以在Java6或Java7环境下使用Spring Boot,通常我们建议你如果可能的话就使用Java8。

2. 内嵌Servlet容器要求

下列内嵌容器在满足对应的Servlet和JDK版本要求时,支持开箱即用(out of the box):

名称

Servlet版本

Java版本

Tomcat 8

3.1

Java7+

Tomcat 7

3.0

Java6+

Jetty 9

3.1

Java7+

Jetty 8

3.0

Java6+

Undertow 1.1

3.1

Java7+

※ Undertow 是一个采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。Undertow 是红帽公司的开源产品,是 Wildfly 默认的 Web 服务器。

你也可以将Spring Boot应用部署到任何兼容Servlet 3.0+的容器。

3. 使用Spring Boot

3.1 直接在Spring Boot CLI上运行,或者在http://start.spring.io/上构建。

3.2 Eclipse上使用Spring IDE插件提供的 New -> Spring Stater Project菜单。

此方法和3.1中的start.spring.io是一样的。

3.3 Maven的pom直接继承spring-boot-starter-parent。

Spring Boot依赖的groupId为 org.springframework.boot 。通常你的Maven POM文件需要继承 spring-boot-starter-parent ,然后声明一个或多个“Starter POMs”依赖。  典型的spring boot项目的pom文件结构如下所述: 

3.4 不使用继承,使用import

Scope=import可以使你无需继承spring-boot-starter-parent,而又保留spring-boot-starter-parent提供的依赖管理(插件管理除外): 

※ 除了3.4以外,3.1到3.3最终形成的pom文件和项目结构是一样的。

七、Spring Boot有哪些不足?

如图所示,Spring Boot没有提供相应的服务发现和注册的配套功能(例如需要借助Spring Cloud和Netflix的Eureka),自身的Actuator所提供的监控功能,也需要与现有的监控对接。没有配套的安全管控方案,对于REST的落地,还需要自行结合实际进行URI的规范化工作。  可见Spring Boot作为一个微框架,离微服务的实现还是有些距离的。

八、参考链接:

http://www.infoq.com/cn/articles/microframeworks1-spring-boot?utm_source=infoq_en&utm_medium=link_on_en_item&utm_campaign=item_in_other_langs http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/ http://www.csdn.net/article/a/2016-05-12/15838098 https://github.com/spring-projects/spring-boot

本文由来源 hemin1003,由 system_mush 整理编辑,其版权均为 hemin1003 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Boot系列 – 2. Spring Boot提供的特性

    本文主要按以下模块介绍spring Boot(1.4.2.RELEASE)提供的特性。

    Java架构师必看
  • MyBatis官方文档-SQL 语句构建器类

    Java程序员面对的最痛苦的事情之一就是在Java代码中嵌入SQL语句。这么来做通常是由于SQL语句需要动态来生成-否则可以将它们放到外部文件或者存储过程中。正...

    Java架构师必看
  • bilibili 架构师 | 高并发实时弹幕系统的实战之路

    刘丁bilibili 架构师2011年毕业,加入猎豹移动从事 C++ 客户端开发,曾开发「远程维修平台」2013年转型后端开发,主要负责猎豹视频软件的后端API...

    Java架构师必看
  • Spring Boot 打包插件,真是太有用了!

    Spring Boot 对 Maven 一直支持很友好,栈长也一直在用 Maven 进行依赖和项目管理,那么今天就讲一下这个插件的作用,非常有用!

    Java技术栈
  • Spring Boot 面试,一个问题就干趴下了!

    最近栈长面试了不少人,其中不乏说对 Spring Boot 非常熟悉的,然后当我问到一些 Spring Boot 核心功能和原理的时候,没人能说得上来,或者说不...

    用户5224393
  • Spring Boot 面试,一个问题就干趴下了!

    最近栈长面试了不少人,其中不乏说对 Spring Boot 非常熟悉的,然后当我问到一些 Spring Boot 核心功能和原理的时候,没人能说得上来,或者说不...

    Java技术栈
  • C#3.0新增功能09 LINQ 标准查询运算符 04 运算

    排序操作基于一个或多个属性对序列的元素进行排序。 第一个排序条件对元素执行主要排序。 通过指定第二个排序条件,您可以对每个主要排序组内的元素进行排序。

    张传宁老师
  • 从0系统学Android--1.2 手把手带你搭建开发环境

    首先 Android 开发是基于 Java 的,因此你需要掌握简单的 Java 语法。会基础的 Java 语法就可以开始。

    开发者
  • Spring Boot 五种热部署方式,提高生产效率

    在SpringBoot中,模板引擎的页面默认是开启缓存的,如果修改了页面的内容,则刷新页面是得不到修改后的页面的,因此我们可以在application.prop...

    搜云库技术团队
  • ISOMORPHIC 的升级之路

    近些年来,史诗级网游 Web Online 中,一个新兴职业 —— Isomorphic JavaScript Application —— 越来越多地得到了玩...

    ThoughtWorks

扫码关注云+社区

领取腾讯云代金券