购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.1 Spring Boot初体验

1.1.1 Spring Boot简介

Spring框架自2003年兴起发展至今,已经成为事实上的JavaEE开发标准框架。它诞生之初是为了解决企业级应用开发的复杂性而创建的,使用Spring可以让简单的JavaBean实现之前只有EJB才能完成的事情。但是Spring不仅仅局限于服务器端开发,任何Java应用都能在简单性、可测试性和松耦合性等方面从Spring中获益,目前的Spring框架已经发展成为一个无所不包的全家桶。

我们使用Spring框架与其他框架进行整合,比如较常见的SSH和SSM框架。想想我们是如何创建一个Spring应用的吧。以搭建一个Spring、Spring MVC、MyBatis为例,首先每一种框架都需要各种配置文件或注解,互相之间的整合也需要配置文件,另外可能还需要使用Maven导入许多依赖、开发测试程序、手动将项目打成war包部署到Servlet容器上,等等,可谓相当烦琐。实际上Spring Boot就是用来简化这些步骤的,它采用约定大于配置、去繁就简的方法,简化了J2EE开发,帮助我们快速创建一个产品级别的Spring应用。针对很多Spring应用程序常见的应用功能,Spring Boot能自动提供相关配置,而且Spring Boot本身也整合了许多优秀的框架。可以这样理解,Spring Boot就像一扇门,打开它,就能看到里面是JavaEE技术堆栈这座大山。

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及整个开发过程。该框架使用了特定的方式进行配置,从而使开发人员不再需要定义样板化的配置。采用Spring Boot可以大大简化开发模式,所有我们想集成的常用框架,它都有对应的组件支持。

Spring Boot基于Spring开发,它本身并不提供Spring框架的核心特性以及扩展功能,只是用来快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合,用于提升Spring开发者体验的工具。同时,它集成了大量常用的第三方库配置(例如Redis、MongoDB、JPA、RabbitMQ、Quartz等),这些第三方库几乎可以零配置地开箱即用,大部分的Spring Boot应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。

Spring Boot一经推出就受到开源社区的追捧,Spring Boot官方提供了很多Starter(可插拔的插件,可集成第三方产品)方便集成第三方产品,很多主流的框架也纷纷主动进行集成,比如MyBatis。Spring官方非常重视Spring Boot的发展,在Spring官网首页进行重点推荐介绍,是目前Spring官方重点发展的项目之一。

1.1.2 Spring Boot的特性和优点

随着Spring不断地发展,涉及的领域越来越多,项目整合开发需要配合各种各样的文件,慢慢变得不那么简单易用,违背了最初的理念,甚至被人戏称为配置地狱。Spring Boot正是在这样的一个背景下被抽象出来的开发框架,目的是为了让大家更容易地使用Spring、更容易地集成各种常用的中间件、开源软件;另一方面,Spring Boot诞生时,微服务概念正处于慢慢酝酿的过程中,Spring Boot的研发融合了微服务架构的理念,成为在Java领域内微服务架构落地的技术支撑。

Spring Boot作为一套全新的框架,来源于Spring大家族,因此Spring所有具备的功能它都有,而且更容易使用;Spring Boot以约定大于配置的核心思想,默认帮我们进行了很多设置,多数Spring Boot应用只需要很少的Spring配置。Spring Boot开发了很多的应用集成包,支持绝大多数开源软件,让我们以很低的成本去集成其他主流开源软件。

Spring Boot主要特性:

· 使用Spring项目引导页面可以在几秒就构建一个项目。

· 方便对外输出各种形式的服务,如REST API、WebSocket、Web、Streaming、Tasks。

· 非常简洁的安全策略集成。

· 支持关系数据库和非关系数据库。

· 支持运行期内嵌容器,如TomCat、Jetty。

· 强大的开发包,支持热启动。

· 自动管理依赖。

· 自带应用监控。

· 支持各种IDE,如IntelliJ IDEA、NetBeans。

Spring Boot的这些特性便于快速地构建独立的微服务。所以使用Spring Boot开发项目,会给我们传统开发带来非常大的便利,可以说如果你使用过Spring Boot开发过项目,那么就会被它简洁、高效的特性所吸引。

使用Spring Boot可以给我们的开发工作带来以下几方面的改进:

· Spring Boot使编码变简单,它提供了丰富的解决方案,快速集成各种解决方案可以提升我们的开发效率。

· Spring Boot使配置变简单,它提供了丰富的Starter,集成了主流开源产品,让我们只需要简单设置即可完成配置。

· Spring Boot使部署变简单,它本身内嵌启动容器,仅仅需要一个命令即可启动项目,因此,结合Jenkins、Docker自动化运维非常容易实现。

· Spring Boot使监控变简单,它自带监控组件,使用Actuator轻松监控服务的各项状态。

1.1.3 Spring Boot开发环境准备

开发环境约束:

· JDK 1.8:Spring Boot推荐JDK 1.7及以上;本书采用Java version 1.8.0_112。

· Maven 3.x:Maven 3.3以上版本;本书采用Apache Maven 3.3.9。

· Spring Boot版本:本书采用2.1.4.RELEASE。

· 开发环境:本书采用IntelliJ IDEA。

进行Spring Boot学习之前需要将开发环境进行如下设置。

1.Maven设置

给Maven的settings.xml配置文件的profiles标签添加如下配置:

<profile>
    <id>jdk-1.8</id>
    <activation>
    <activeByDefault>true</activeByDefault>
    <jdk>1.8</jdk>
    </activation>
    <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
   </properties>
</profile>

这里使用的Maven版本是3.3.9,对于使用Maven 3,我们可以有多个地方定义profile。定义的地方不同,它的作用范围也不同。

针对特定项目的profile配置,我们可以定义在该项目的pom.xml中。

针对特定用户的profile配置,我们可以在用户的settings.xml文件中定义profile。该文件在用户home目录下的“.m2”目录下。

针对全局的profile配置,全局的profile定义在Maven安装目录下的“conf/settings.xml”文件中。

以上配置就是定义了Java的编译版本是1.8,定义在全局profile下,这样对所有的Maven项目都会生效。

2.IDEA设置

整合Maven进来,单击File菜单选择settings,选择Maven并配置其安装目录和setting.xml配置文件存储的位置,如图1-1所示。

图1-1

1.1.4 Spring Boot入门程序

我们来看第一个Spring Boot程序,这个程序实现的功能是:浏览器发送hello请求,服务器接受请求并处理,响应“Hello World”字符串。入门程序的项目名为spring-boot-01-helloworld,在本章案例源码(案例源码下载参见前言)文件夹中。

开发步骤:

(1)创建一个Maven工程。

(2)导入Spring Boot相关的依赖。

示例代码1-1 pom.xml(文件的部分代码或者文件的核心代码)

(3)编写一个主程序,启动Spring Boot应用:

示例代码1-2 HelloWorldMainApplication .java

(4)编写相关的Controller:

示例代码1-3 HelloController .java

(5)运行主程序测试。

(6)简化部署。

为了简化Spring Boot项目的部署,可以引入spring-boot-maven-plugin插件。Spring Boot的Maven插件(Spring Boot Maven plugin)能够以Maven的方式为应用提供Spring Boot的支持,即为Spring Boot应用提供了执行Maven操作的可能。

Spring Boot Maven plugin能够将Spring Boot应用打包为可执行的jar或war文件,然后以通常的方式运行Spring Boot应用。

Spring Boot Maven plugin的5个Goals:

· spring-boot:repackage:默认goal。在mvn package之后,再次打包可执行的jar/war,同时保留mvn package生成的jar/war为.origin。

· spring-boot:run:运行Spring Boot应用。

· spring-boot:start:在mvn integration-test阶段,进行Spring Boot应用生命周期的管理。

· spring-boot:stop:在mvn integration-test阶段,进行Spring Boot应用生命周期的管理。

· spring-boot:build-info:生成Actuator使用的构建信息文件build-info.properties。

具体引入的代码如下:

该插件可以将这个应用打包成jar包,直接使用java -jar的命令执行。

1.1.5 入门程序分析

下面对上一小节的Spring Boot入门程序进行分析。

1.POM文件分析

(1)父项目

<parent>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
</parent>

它的父项目是spring-boot-starter-parent,父项目所对应的配置文件是:

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-dependencies</artifactId>
   <version>2.1.4.RELEASE</version>
   <relativePath>../../spring-boot-dependencies</relativePath>
</parent>

该配置文件真正用于管理Spring Boot应用中所有的依赖版本,是Spring Boot的版本仲裁中心。

以后我们再导入依赖时默认就不需要写版本号了,因为父项目的配置文件已经替我们管理好了(没有在dependency中管理的依赖则需要声明版本号)。

(2)启动器

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
</dependency>

spring-boot-starter:Spring Boot场景启动器,用于导入Web模块正常运行所依赖的组件。

Spring Boot将所有的功能场景都抽取出来,做成多个Starter(启动器),只需要在项目中引入这些Starter,相关场景的所有依赖都会导入进来。需要用到什么功能就导入什么场景的启动器。

2.主程序类,主入口类分析

我们来看一下主程序类:

@SpringBootApplication:Spring Boot应用标注在某个类上,说明这个类是Spring Boot的主配置类,Spring Boot就应该运行这个类的main方法来启动Spring Boot应用。这个注解的部分源代码如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
   @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
   @Filter(type = FilterType.CUSTOM, classes =
AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication

上面这些注解的具体含义如下:

· @SpringBootConfiguration:Spring Boot的配置类,标注在某个类上,表示这是一个Spring Boot的配置类。

· @Configuration:配置类上标注这个注解,其作用等同于Spring的管理Bean的配置文件。

· @EnableAutoConfiguration:开启自动配置功能。

以前我们需要配置的配置项,Spring Boot可以帮我们自动配置,@EnableAutoConfiguration告诉Spring Boot开启自动配置功能,这样自动配置才能生效。

下面是EnableAutoConfiguration的部分源码:

@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
@AutoConfigurationPackage:自动配置包
@Import(AutoConfigurationPackages.Registrar.class)

上面几个注解的含义如下:

· Spring的底层注解@Import:给容器中导入一个组件,导入的组件是AutoConfigurationPackages.Registrar.class。将主配置类(@SpringBootApplication标注的类)所在的包及其下面所有子包中的所有组件扫描到Spring容器。

@Import(EnableAutoConfigurationImportSelector.class)

· EnableAutoConfigurationImportSelector:该类将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中,会给容器中导入非常多的自动配置类(xxxAutoConfiguration),就是说给容器中导入这个场景需要的所有组件。部分自动配置类如图1-2所示。

图1-2

有了自动配置类,我们就无须手动编写注入功能组件的配置。

SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,
classLoader);

Spring Boot在启动的时候,从自动配置类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就会生效,以前我们需要自己配置的配置项,自动配置类都代劳了。

J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure-2.1.4.RELEASE.jar中。 dBU3WL/bLvZV29G9pGCUyLKbvTSWpTPa4JoBaSuqMnjEhHJZ0Tif7L3OkKa1/dYZ

点击中间区域
呼出菜单
上一章
目录
下一章
×