微服务 SpringBoot 2.0(一):简单入门构建

我做好了从入门到放弃的准备,你却告诉我炒鸡简单 —— 知码学院

引言

SpringBoot是由Pivotal团队提供的全新框架,从最根本上来讲,Spring Boot就是简化开发人员从0构建项目的繁琐步骤,巧妙的封装了很多插件模块,让开发人员不再担心版本依赖或复杂的三方依赖问题,它能够被任意项目的构建系统所使用。

入门项目

接下来,我们什么都先不谈,本文着重介绍SpringBoot简单配置与服务搭建,预计花费您5分钟的阅读时间,动起来吧,非常非常简单噢。

工具

SpringBoot版本:2.0.4
开发工具:IDEA 2018
Maven:3.3 9
JDK:1.8

项目快速建立方式一:

首先我们在SPRING INITIALIZR 上建一个简单项目,并导入到IDEA中,如下图:

详见网址

下一步,导入到工程
下一步,选择已有模块
下一步,更改maven变量
下一步,选择JDK1.8目录
简单项目建立完成
项目快速建立方式二(常用):

步骤 File—>New—>Project

手动快速建立

输入maven信息
选择web,下一步

下一步,然后直接完成,选择new window即可

创建完成,下面我们解析刚刚涉及到的几个点

工程结构

DemoApplication.java:应用程序启动入口,可直接Run启动服务,类似于tomcat的start.sh
DemoApplicationTests.java:Junit测试类,已自动注入加载了SpringBoot容器的上下文
application.properties:配置属性空文件,可改为application.yml文件,SpringBoot都能识别
pom.xml:maven工程定义文件,表明该项目的maven坐标信息

疑问解析

  1. 构建项目时为何选择了Spring Initializr
    答:spring initializr 是Spring 官方提供的一个很好的工具,用来初始化一个Spring boot 的项目
  2. spring initializr有两种用法。一是在官网创建然后导入到编辑器,二是直接File->New->Project

SpringBoot 之pom.xml

以下简称xml,xml中与普通maven项目的xml无太多差异,如下:


SpringBoot的pom.xml
pom差异解析

差异一. 引入了该parent说明具备了SpringBoot的基本功能,可直接依赖其父工程(SpringBoot)的包,如差异二(无需声明版本号)

差异二. web应用启动核心jar,解压出来里面除了些依赖什么都没有,所以Starter主要用来简化依赖用的,比如我们之前做MVC时要引入日志组件,那么需要去找到log4j的版本,然后引入,现在有了Starter之后,直接用这个之后,log4j就自动引入了,也不用关心版本这些问题,注:若想更改其下某一个jar(如log4j)的版本,则可自行进行升降

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

独特实现(不常用)

如果你不想使用spring-boot-starter-parent,或您自己有一套parent依赖标准,您仍然可以通过使用scope = import依赖关系来保持依赖关系管理:

<dependencyManagement>
     <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.0.4.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 -->

        <!--Spring Data版本更改至Kay-SR9 |变更部分  start-->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-releasetrain</artifactId>
            <version>Kay-SR9</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
        <!--注意:需啊哟在spring-boot-dependencies之前加入需更改的   |变更部分 end -->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.0.4.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>


    </dependencies>
</dependencyManagement>

此处详见官方文档:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-yaml-shortcomings 模块:13.2.2 Using Spring Boot without the Parent POM

常用依赖模块

Spring Boot提供了很多已封装好的模块,类似于插件,拿来即用,大多都是spring-boot-starter-xx风格,如果要用直接引入即可,就像组装电脑,组装i3还是装i5的CPU看你 自己,下面我们随便举例几个:

<!--快速web应用开发-->
<artifactId>spring-boot-starter-web</artifactId>

<!--redis缓存服务-->
<artifactId>spring-boot-starter-redis</artifactId>

<!--应用日志-->
<artifactId>spring-boot-starter-logging</artifactId>

<!--容器层约定和定制-->
<artifactId>spring-boot-starter-jetty</artifactId>
<artifactId>spring-boot-starter-undertow</artifactId>

<!--数据库访问-->
<artifactId>spring-boot-starter-jdbc</artifactId>

<!--面向切面-->
<artifactId>spring-boot-starter-aop</artifactId>

<!--应用安全-->
<artifactId>spring-boot-starter-security</artifactId>

应用演示

以我们刚刚新建的DemoApplication.java为例
1.pom.xml文件加入web服务插件(呀,是谁这么聪明,以前弄个springmvc一套下来10来个jar,现在只管一个了)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  1. 我们直接在注解上面加入@RestController,并且加入一个RequestMapping方法,启动服务器之后,我们访问这个方法即可看到效果
package com.ron.demo;

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 DemoApplication {

    @RequestMapping("/index")
    public String index(){
        return "Hello Spring Boot";
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);

    }
}
  1. @RestController注解等价于@Controller+@ResponseBody的结合,使用这个注解的类里面的方法都以json格式输出
  2. @SpringBootApplication是Sprnig Boot项目的核心注解,主要目的是开启自动配置。后续讲解原理的时候深入介绍。
  3. main方法这是一个标准的Java应用的main的方法,主要作用是作为项目启动的入口。
run运行
启动成功
打开浏览器访问
成功访问

单元测试场景

找到项目目录了src/test/下的测试入口,编写简单的http请求来测试;使用mockmvc进行,利用MockMvcResultHandlers.print()打印出执行结果。

package com.ron.demo;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {

    private MockMvc mvc;
    @Before
    public void setUp() throws Exception {   <!--此处为需要测试的Controller类-->
        mvc = MockMvcBuilders.standaloneSetup(new DemoApplication()).build();
    }

    @Test
    public void contextLoads() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/index").accept(MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();

    }

}

直接在DemoApplicationTests 中 Ctrl+Shift+F10运行即可看到如下运行结果,若报错请仔细检查@Before方法

控制台运行结果

热部署配置(会重启)

工欲善其事,必先利其器。在开发的时候,难免会反复进行修改调试,就目前而言,修改了代码后是无法直接编译生效,所以需要我们添加以下依赖,添加后一定要确保已经依赖噢

  1. 添加如下依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>

2.plugin中加入如下

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

                <!--加入部分 start-->
                <configuration>
                    <fork>true</fork>
                </configuration>
                <!--加入部分 end-->

            </plugin>
        </plugins>
    </build>
  1. 第三步修改IDE


    settings
Registry

设置完成后重启IDEA即可,本操作在修改代码之后只会做到自动启动服务

总结

会使用SpringBoot之后,老板再也不用担心我写代码的速度,总结下来就是简单、快速、方便!平时如果我们需要搭建一个spring web项目的时候准备依赖包都要很大一部分时间,现在都不用啦。


作者有话说:喜欢的话就请移步知码学院,请自备水,更多干、干、干货等着你

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容