Spring Boot入门

2013 年初开始的 Spring Boot 项目的研发,到今天,Spring Boot 的版本已经到了 2.0.3 RELEASE。Spring Boot 并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。同时它集成了大量常用的第三方库配置,Spring Boot应用中这些第三方库几乎可以是零配置的开箱即用(out-of-the-box),大部分的 Spring Boot 应用都只需要非常少量的配置代码(基于 Java 的配置),开发者能够更加专注于业务逻辑。

为什么学习Spring Boot

从Spring官方来看

我们打开 Spring 的官方网站,可以看到下图:

Spring官网首图

我们可以看到图中官方对 Spring Boot 的定位:Build Anything, Build任何东西。Spring Boot旨在尽可能快地启动和运行,并且只需最少的 Spring 前期配置。 同时我们也来看一下官方对后面两个的定位:

SpringCloud:Coordinate Anything,协调任何事情;
SpringCloud Data Flow:Connect everything,连接任何东西。

仔细品味一下,Spring 官网对 Spring Boot、SpringCloud 和 SpringCloud Data Flow三者定位的措辞非常有味道,同时也可以看出,Spring 官方对这三个技术非常重视,是现在以及今后学习的重点。

从Spring Boot的优点来看

Spring Boot 有哪些优点?主要给我们解决了哪些问题呢?我们以下图来说明:

Spring Boot的优点

Spring Boot 让配置变得更简单

Spring Boot 让配置变简单,说到这里我们就需要了解一下 Spring Boot 的核心思想:约定优于配置。那么什么是约定优于配置呢?约定优于配置(convention over configuration),也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。

本质是说,开发人员仅需规定应用中不符约定的部分。例如,如果模型中有个名为 User 的类,那么数据库中对应的表就会默认命名为 user。只有在偏离这一约定时,例如将该表命名为”user_info”,才需写有关这个名字的配置。

Spring Boot 体系将约定优于配置的思想展现得淋淋尽致,小到配置文件,中间件的默认配置,大到内置容器、生态中的各种 Starters 无不遵循此设计规则。Spring Boot 鼓励各软件组织方创建自己的 Starters ,创建 Starter 的核心组件之一就是 autoconfigure 模块,也是 Starter 的核心功能就是在启动的时候进行自动装配,属性默认化配置。

Spring Boot 让部署变得更简单

说起 Spring Boot 让部署变简单,就不得不说 Spring Boot 内嵌容器。内嵌容器不只让部署变得简单,其实在开发调试阶段也会带来非常大的便利性,对比以往开发 Web 项目时配置 Tomcat 的繁琐,会让大家使用 Spring Boot 内嵌容器开发时有更深的感触。使用 Spring Boot 开发 Web 项目,让我们不需要关心容器的环境问题,专心写业务代码即可。

但内嵌容器对部署带来的改变其实更多,现在 Maven 、Gradle 已经成了我们日常开发必不可少的构建工具,使用这些工具很容易的将项目打包成 Jar 或者 War 包,在服务器上我们仅仅只需要一条命令就可以启动项目。Spring Boot 支持在启动的时候添加定制,比如设置应用的堆内存、垃圾回收机制、日志路径等等。

虚拟化技术的发展给我们带来了更多的可能性,我们可以利用容器化技术,将 Spring Boot 项目做成镜像,根据容器集群的策略来实现弹性扩容、动态部署等。所以 Spring Boot + Docker + Jenkins 会将 Spring Boot 项目的部署做得更简单化、智能化。

Spring Boot 让监控变得更简单

可以说 Spring Boot 就是一款自带监控的开源软件,在设计之初就考虑到应用的监控问题,专门提供了一款监控组件来完成这个工作,这个组件就是
Spring Boot Actuator 。Spring Boot Actuator 是 Spring Boot 提供的对应用系统监控的集成功能,可以查看应用配置的详细信息,例如自动化配置信息、创建的 Spring beans 以及一些环境属性等。

当然 Spring Boot Actuator 虽然可以监控一个 Spring Boot 应用的健康情况,实际上现在的系统都是需要很多的服务相互配合来完成工作,如何通过一个监控软件来监控所以的 Spring Boot 项目将变得比较紧迫。在开源界也有人意识到了这个问题,并且基于 Spring boot actuator 做出了一款强大的监控软件,这个软件就是 Spring Boot admin 。

使用 Spring Boot Admin 不仅可以监控 Spring Boot 项目,还可以监控 Spring Cloud 项目,因此使用了 Spring Boot 项目之后我们监控 Spring Boot 集群效果如下:

简单、直观、易用是它的特点,针对一些特殊情况还可以提供报警服务。所以说使用 Spring Boot Actuator 解决了单个 Spring Boot 的监控问题,使用 Spring Boot Admin 就是解决了整个集群监控的问题

Spring Boot 基于 Spring 4.0

Spring Boot 是伴随着 Spring 4.0 诞生的,从字面理解,Boot是引导的意思,因此 Spring Boot 旨在帮助开发者快速搭建 Spring 框架。Spring Boot 继承了原有 Spring 框架的优秀基因,使 Spring 在使用中更加方便快捷。

由上可知,Spring Boot不是一门新技术,所以不用紧张。从本质上来说,Spring Boot就是Spring,它做了那些没有它你也会去做的Spring Bean配置。它使用“习惯优于配置”(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速运行起来。使用Spring Boot很容易创建一个独立运行(运行jar,内嵌Servlet容器)、准生产级别的基于Spring框架的项目,使用Spring Boot你可以不用或者只需要很少的Spring配置。

 

Spring Boot 让编码测试变得更简单

系统要求

建议使用Java 1.8,Spring Boot 1.5.RELEASE以及Maven3.3.9及以上版本。开发工具使用IDEA

光速入门-开发一个web服务

没有比较就没有伤害,让我们先看看传统Spring MVC开发一个简单的Hello World Web应用程序,你应该做什么,我能想到一些基本的需求。

  • 一个项目结构,其中有一个包含必要依赖的Maven或者Gradle构建文件,最起码要有Spring MVC和Servlet API这些依赖。
  • 一个web.xml文件(或者一个WebApplicationInitializer实现),其中声明了Spring的DispatcherServlet。
  • 一个启动了Spring MVC的Spring配置
  • 一控制器类,以“hello World”相应HTTP请求。
  • 一个用于部署应用程序的Web应用服务器,比如Tomcat。

最让人难以接受的是,这份清单里面只有一个东西是和Hello World功能相关的,即控制器,剩下的都是Spring开发的Web应用程序必需的通用模板。

接下来看看Spring Boot如何搞定?
很简单,我仅仅只需要非常少的几个配置就可以迅速方便的搭建起来一套web项目

初始化Spring Boot项目

构建一个Sping Boot的Maven项目,强烈推荐Spring Initializr,它从本质上来说就是一个Web应用程序,它能为你生成Spring Boot项目结构。
Spring Initializr有几种用法:

  • 通过Web界面使用
  1. 访问:http://start.spring.io/
  2. 选择构建工具Maven Project、Spring Boot版本1.5.1以及一些工程基本信息,可参考下图所示

  3. 点击Generate Project下载项目压缩包

  4. 导入到你的工程,如果是IDEA,则需要:
    a.菜单中选择File–>New–>Project from Existing Sources...
    b.选择解压后的项目文件夹,点击OK
    c.点击Import project from external model并选择Maven,点击Next到底为止。
    d.若你的环境有多个版本的JDK,注意到选择Java SDK的时候请选择Java 7以上的版本
  • 通过IntelliJ IDEA使用(个人推荐)
    IntelliJ IDEA是非常流行的IDE,IntelliJ IDEA 14.1已经支持Spring Boot了。
    创建Spring Boot操作步骤如下:
    1.在File菜单里面选择 New > Project,然后选择Spring Initializr,接着如下图一步步操作即可。

项目结构

根据上面的操作已经初始化了一个Spring Boot的框架了,项目结构如下:

如你所见,项目里面基本没有代码,除了几个空目录外,还包含如下几样东西。

  • pom.xml:Maven构建说明文件。
  • Chapter1Application.java:一个带有main()方法的类,用于启动应用程序(关键)。
  • Chapter1ApplicationTests.java:一个空的Junit测试类,它加载了一个使用Spring Boot字典配置功能的Spring应用程序上下文。
  • application.properties:一个空的properties文件,你可以根据需要添加配置属性。

解析pom.xml

大家跟我一起移步pom.xml,看看Spring Boot的跟普通Spring MVC工程的Maven配置有啥不一样

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.it</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.15.BUILD-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

可以看出,有几个配置是不大一样的,我们挑几个重要的说说,要是客观不想过早的了解这些,自行跳过这一知识点即可。

Spring Boot父级依赖

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.15.BUILD-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

这块配置就是Spring Boot父级依赖,有了这个,当前的项目就是Spring Boot项目了,spring-boot-starter-parent是一个特殊的starter,它用来提供相关的Maven默认依赖,使用它之后,常用的包依赖可以省去version标签。关于Spring Boot提供了哪些jar包的依赖,可查看C:\Users\用户.m2\repository\org\springframework\boot\spring-boot-dependencies\1.5.15.RELEASE\spring-boot-dependencies-1.5.15.RELEASE.pom
这里我就贴一点点意思意思,如下:

<properties>
		<!-- Dependency versions -->
		<activemq.version>5.14.5</activemq.version>
		<antlr2.version>2.7.7</antlr2.version>
		<appengine-sdk.version>1.9.64</appengine-sdk.version>
		<artemis.version>1.5.6</artemis.version>
		<aspectj.version>1.8.13</aspectj.version>
		<assertj.version>2.6.0</assertj.version>
		<atomikos.version>3.9.3</atomikos.version>
		<bitronix.version>2.1.4</bitronix.version>
		<caffeine.version>2.3.5</caffeine.version>
		<cassandra-driver.version>3.1.4</cassandra-driver.version>
		<classmate.version>1.3.4</classmate.version>
		<commons-beanutils.version>1.9.3</commons-beanutils.version>
		<commons-collections.version>3.2.2</commons-collections.version>
		<commons-codec.version>1.10</commons-codec.version>
		<commons-dbcp.version>1.4</commons-dbcp.version>
		<commons-dbcp2.version>2.1.1</commons-dbcp2.version>
		<commons-digester.version>2.1</commons-digester.version>
		<commons-pool.version>1.6</commons-pool.version>
		<commons-pool2.version>2.4.3</commons-pool2.version>
		<couchbase-client.version>2.3.7</couchbase-client.version>
		<couchbase-cache-client.version>2.1.0</couchbase-cache-client.version>
		<crashub.version>1.3.2</crashub.version>
		<derby.version>10.13.1.1</derby.version>
		<dom4j.version>1.6.1</dom4j.version>
		<dropwizard-metrics.version>3.1.5</dropwizard-metrics.version>
		<ehcache.version>2.10.5</ehcache.version>
		<ehcache3.version>3.2.3</ehcache3.version>
......
 </properties>

 

如果你不想使用某个依赖默认的版本,您还可以通过覆盖自己的项目中的属性来覆盖各个依赖项,例如,要升级到另一个Spring Data版本系列,您可以将以下内容添加到pom.xml中。

<properties>
    <spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>

原本默认版本是Ingalls-RELEASE的(看上面最后一行有说明Ingalls-RELEASE),现在就使用Fowler-SR2版本了,简单吧。

并不是每个人都喜欢继承自spring-boot-starter-parent POM。您可能有您需要使用的自己的公司标准parent,或者您可能更喜欢显式声明所有的Maven配置。
如果你不想使用spring-boot-starter-parent,您仍然可以通过使用scope = import依赖关系来保持依赖关系管理:

<dependencyManagement>
     <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.5.1.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

该设置不允许您使用如上所述的属性(properties)覆盖各个依赖项,要实现相同的结果,您需要在spring-boot-dependencies项之前的项目的dependencyManagement中添加一个配置,例如,要升级到另一个Spring Data版本系列,您可以将以下内容添加到pom.xml中。

<dependencyManagement>
    <dependencies>
        <!-- Override Spring Data release train provided by Spring Boot -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-releasetrain</artifactId>
            <version>Fowler-SR2</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.5.1.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

 

启动器(starter)

启动器是一组方便的依赖关系描述符,可以包含在应用程序中。 您可以获得所需的所有Spring和相关技术的一站式服务,无需通过示例代码搜索和复制粘贴依赖配置。 例如,如果要开始使用Spring和JPA进行数据库访问,那么只需在项目中包含spring-boot-starter-data-jpa依赖关系即可。

启动器包含许多依赖关系,包括您需要使项目快速启动并运行,并具有一致的受支持的依赖传递关系

常用的起步依赖可参考:https://blog.csdn.net/fmwind/article/details/82691907

Spring Boot提供了很多”开箱即用“的依赖模块,所有正式起动器都遵循类似的命名模式: spring-boot-starter- * ,其中 * 是特定类型的应用程序。 这个命名结构旨在帮助你快速找到一个启动器。举个例子来说明一下这个起步依赖的好处,比如组装台式机和品牌机,自己组装的话需要自己去选择不同的零件,最后还要组装起来,期间有可能会遇到零件不匹配的问题。耗时又消力,而品牌机就好一点,买来就能直接用的,后续想换零件也是可以的。相比较之下,后者带来的效果更好点(这里就不讨论价格问题哈),起步依赖就像这里的品牌机,自动给你封装好了你想要实现的功能的依赖。就比如我们之前要实现web功能,引入了spring-boot-starter-web这个起步依赖。我们来看看spring-boot-starter-web到底依赖了哪些,如下图:

看来依赖了好多呢,如果让我自己弄估计要调半天,所以Spring Boot通过提供众多起步依赖降低项目依赖的复杂度。起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。很多起步依赖的命名都暗示了它们提供的某种或者某类功能。

Spring Boot Maven插件

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

 

上面的配置就是Spring Boot Maven插件,Spring Boot Maven插件提供了许多方便的功能:

  • 把项目打包成一个可执行的超级JAR(uber-JAR),包括把应用程序的所有依赖打入JAR文件内,并为JAR添加一个描述文件,其中的内容能让你用java -jar来运行应用程序。
  • 搜索public static void main()方法来标记为可运行类。

应用入口类

Chapter1Application是一个很关键的启动类,程序的入口就是这里,为了演示简单,我们不再新建控制类,而是直接在这个入口类中编写,添加@RestController以及index方法,如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class Chapter1Application {

	@RequestMapping("/")
	public String index(){
		return "Hello Spring Boot";
	}
	public static void main(String[] args) {
		SpringApplication.run(Chapter1Application.class, args);
	}
}
  1. @SpringBootApplication是Sprnig Boot项目的核心注解,主要目的是开启自动配置。后续讲解原理的时候再深入介绍。
  2. main方法这是一个标准的Java应用的main的方法,主要作用是作为项目启动的入口。

  3. @RestController注解等价于@Controller+@ResponseBody的结合,使用这个注解的类里面的方法都以json格式输出。

最后,启动项目有三种方式:

  • Chapter1Application的main方法
  • 使用命令 mvn spring-boot:run”在命令行启动该应用,IDEA中该命令在如下位置:
  • 运行“mvn package”进行打包时,会打包成一个可以直接运行的 JAR 文件,使用“java -jar”命令就可以直接运行。

打开浏览器访问http://localhost:8080, 你就能看到页面显示Hello Spring Boot效果了,一个简单的Web的项目就是如此简单。

从未来发展的趋势来看

微服务是未来发展的趋势,项目会从传统架构慢慢转向微服务架构,因为微服务可以使不同的团队专注于更小范围的工作职责、使用独立的技术、更安全更频繁地部署。而 继承了 Spring 的优良特性,与 Spring 一脉相承,而且 支持各种REST API 的实现方式。Spring Boot 也是官方大力推荐的技术,可以看出,Spring Boot 是未来发展的一个大趋势。

 

本系统文章大多转自http://tengj.top/2017/04/24/springboot0/  

在作者的基础上都做了适当的修改,特此感谢

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值