如何使用Spring Boot从0到1搭建一个Java后台(一)

关于如何使用Spring Boot从0到1搭建一个Java后台,主要分为三篇文章来介绍:第一篇文章主要介绍搭建一个Java后台需要的相关技术;第二篇文章主要介绍如何使用代码来实现一个完整的后台接口;第三篇文章主要介绍自己在写一个简单java后台项目遇到的一些问题。本篇为第一篇文章。

在写这个Java后台项目的时候,使用了Spring Boot来进行开发,里面采用了Spring MVC的架构风格,使用了Restful来设计对应的Api接口,使用了AES加密与解密算法来实现接口的安全与加密,使用了Mybatis来操作Mysql数据库,使用了单元测试和集成测试来验证接口是否正确。下面就简单介绍下对应的技术。

Spring Boot

大部分Spring Boot应用只需要简单的Spring配置就可以了,而一般的Spring应用则需要很多的配置,比如Spring MVC应用,需要配置dispathcerServlet,需要配置applicationContext.xml、springmvc-config.xml等,还需要添加Spring MVC所依赖的各种jar包。但是在Spring Boot应用中这些都是不需要配置的。我们来创建一个简单的Spring Boot项目,来说明其配置的简单性。

第一步,打开IntelliJ IDEA工具,选择maven,创建一个maven项目出来,项目创建好后如下图所示:

Spring-boot 1-1.png

第二步,打开pom.xml,加入以下依赖配置,如下所示:

<repositories>
    <repository>
        <id>maven-snapshots</id>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        <snapshots><enabled>false</enabled></snapshots>
    </repository>
</repositories>

<!-- Inherit defaults from Spring Boot -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.8.RELEASE</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</artifactId>
    </dependency>

    <!-- Add typical dependcies for a web application -->
    <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>

<!-- Package as an executable jar -->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

第三步,创建一个ArticleSpringBootApplication类,配置main函数,如下图所示:

spring-boot 1-2.png

第四步,创建一个HelloController类,实现Hello World的输出,如下图所示:

spring-boot 1-3.png

第五步,点击ArticleSpringBootApplication旁边的run,运行整个项目,看到如下输出,则说明Spring Boot项目已经成功启动:

spring-boot 1-4.png

第六步,打开浏览器,在地址栏输入http://localhost:8080/hello,就会打印出Hello World,如下图所示:

spring-boot 1-5.png

通过这个例子,我们可以看出在整个Spring Web项目中,我们只是简单地在pom.xml中加入了一些简单的依赖,这相比于传统的web项目创建无疑是简单了许多。为什么Spring Boot的配置这么简单呢?这是因为spring-boot-starter-parent起到了关键的作用。因为Spring项目中的许多配置都默认从spring-boot-starter-parent中继承过来的,这大大减少了spring项目的配置,这也是我为什么选择使用Spring Boot来实现Java后台项目的原因。

更多关于Spring Boot的介绍,可以参考官方文档给出的介绍,链接如下所示:

英文文档

中文文档

REST

REST是一种分布式应用的架构,也是一种大流量分布式应用的设计方法论。REST的英文全称为Representational State Transfer,翻译成中文就是表现层状态转换。要理解RESTful架构,最好的方法就是去理解Representational State Transfer这个词组到底是什么意思,它的每一个词都代表了什么涵义,把这个搞懂了,就能理解REST是一种什么样的设计。关于如何理解REST,可以参考阮一峰老师的这篇文章

引用一下阮一峰老师总结的RESTful架构:

  • 每一个URI代表一种资源。
  • 客户端和服务器之间,传递这种资源的某种表现层。
  • 客户端通过四个HTTP动词,对服务器端资源进行操作,实现表现层状态转化。

理解完什么是RESTful架构后,我们看下在设计RESTful Api需要注意的地方,最常见的错误就是URI中包含动词。因为资源表示一种实体,所以应该是名词,URI不应该有动词,动词应该放在HTTP协议中。比如某个URI为/hrm/users/show,其中show为动词,这样设计出来的URI就错误了。这个URI的目的是查询用户的列表,但是在URI中不应该出现show动词,而是应该通过HTTP的GET方法表示show,所以正确的URI应该为GET /hrm/users。下面通过一个简单的例子来说明下HTTP中的5种动作请求。

GET /hrm/users 查询用户的列表
POST /hrm/users 增加一个用户
DELETE /hrm/users/id 删除一个用户
PUT /hrm/users/id 更新一个用户(提供该用户的全部信息)
PATCH /hrm/users/id 更新一个用户(提供该用户的部分信息)

更多关于Restful Api设计可以参考阮一峰老师的另外一篇文章

Mybatis

关于Mybatis的介绍与使用可以参考我之前写的Mybatis使用介绍这篇文章,下面介绍下在Spring Boot中如何使用Mybatis。打开pom.xml加入以下依赖:

    <!-- Mybatis集成 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.30</version>
    </dependency>

    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.1</version>
    </dependency>

再打开application.properties加入JDBC配置就可以了,如下所示:

# JDBC配置
spring.datasource.druid.url=jdbc:mysql://127.0.0.1:3306/ddn_hrm_db?useUnicode=true&characterEncoding=utf8
spring.datasource.druid.username=root
spring.datasource.druid.password=
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

这样mybatis的配置就完成了,mybatis的具体使用会在我的下篇文章中有详细的介绍。

接口安全与加密

现在大部分后台接口都采用RESTful架构,RESTful Api的身份证应该使用OAuth2.0框架,也就是说客户端在每次请求时都要带上身份验证信息,实现上,大部分都采用token的认证方式,一般流程如下所示:

  1. 用户登录成功后,服务器端返回token和refreshToken给客户端。
  2. 客户端把token、refreshToken保存到本地,以后发送的每个请求,都将token发回服务器端。
  3. 服务器端检查token的有效性,有效则返回数据,若无效,分为两种情况:
    • token错误,用户需要重新登录,获取正确的token。
    • token过期,用户重新登录,使用refreshToken重新获得token。

使用OAuth2.0进行api身份验证,比较适合对外提供的api,对于公司内部的api,一般采用接口加密的方法来进行实现。在这个Java后台项目中,就是采用的接口加密的方法,主要用到了md5加密算法和AES加密算法。

MD5算法是典型的消息摘要算法,常用于验证数据的完整性,是数字签名算法的核心算法。其前身有MD2、MD3和MD4算法,它由MD4、MD3、MD2算法改进而来。不论哪一种MD算法,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。因为MD5算法常用于验证数据的完整性,所以客户端在发送一个请求的时候,客户端对请求所传的参数进行MD5计算从而得到一个sign签名,传递给服务器端。服务器端,拿到客户端传递过来的参数再次进行MD5计算得到一个新的sign签名。如果客户端传递过来的sign签名和服务器端计算出来的sign签名相等,则说明数据是完整性的,否则,数据在传输的过程中已经被篡改了。

AES加密算法是对称加密算法,AES算法因密钥建立时间短、灵敏性好、内存需求低等优点,应用的比较广泛,并且目前采用的AES算法能够有效抵御已知的针对DES算法的所有攻击方法。在上面我们只是对参数进行MD5计算得到一个sign签名,用来校验数据是否完整性,但是数据在传输的过程中,我们还要对传输的数据进行下AES加密,这样就能够有效地提高接口的安全性

更多关于加密算法的内容,可以去这里下载下Java加密与解密的艺术 提取密码:6j4v

参考文章:

App架构设计经验:接口的设计

测试

Spring Boot提供了一系列的工具和注解来测试你的应用,主要通过以下两个组件来进行实现。

  • spring-boot-test 包含了核心的部分。
  • spring-boot-test-autoconfigure 支持自动配置。

对于大部分的开发者会使用spring-boot-starter-test,它里面包含了JUnit、AssertJ、Hamcrest组件以及其他许多有用的库。其中JUnit主要用于进行单元测试,Spring Test和Spring Boot Test主要用于集成测试。

想更多了解测试的内容,可以参考下面两篇文章:

Spring-boot-reference关于Testing的那部分

JUnit入门概述

总结

这篇文章主要就讲了下自己在写这个Java后台项目时用到了哪些技术,看了哪些文章,整理了下,希望对刚开始学习Java后台开发的人有所帮助。我会在第三篇文章的时候,把自己写的这个简单的Java后台项目给开源出来,到时欢迎大家关注。

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

推荐阅读更多精彩内容