Spring Boot初了解

  • 2018-10-30
  • 0
  • 0

Author : 黄志成

博客地址: 博客

最近这段时间一直在忙于开发,今天忙里偷闲更新一篇博客吧.

偶尔在找一些学习资料的时候,总是发现服务治理,服务发现,微服务架构这些高大上的词.但点进去一看实践方式都是使用JAVA.对此作为一个PHPer很不开心.为了将这些概念能更好的引入到我们PHP当中,我将去学习一下JAVA.

当然,学习一门语言就需要它的环境.这里笔者使用的是Mac电脑.系统自带了JDK1.6.本篇文章是基于jdk1.8的.我们去官网上下载一下即可.

不过这里有一个小坑.一定要下载JDK.不要下载JRE

JDK:java development kit (java开发工具)
JRE:java runtime environment (java运行时环境)

如果下载了JRE,就仅仅能运行java环境.这里我就踩了坑.可能是我英语太差,没读懂就直接点下载了.

安装好后查看一下版本

$ java -version
> java version "1.8.0_191"
> Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
> Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

好了,环境就简单的介绍到这里.下面进入本次的话题吧

Spring家族

  • Spring MVC
  • Spring Boot
  • Spring Cloud

Spring MVC 一个轻量级的控制反转(IoC)和面向切面(AOP)的容器,是一个Java开发web程序框架

Spring Boot 是 Spring MVC 的升级版.虽然是升级版但是两者学习起来是没有关联性的.可以去直接学习 Spring Boot

Spring Boot 最大特点就是简化了配置.同时也是一个微服务入门级框架.

同样 Spring Cloud 是spring Boot的升级版提供了一些常用的分布式组件.

在使用之前我们还需要有Maven的环境,Maven是一个包管理工具.类似于Python的pip.

从官网(https://maven.apache.org/download.cgi)下载 Maven 并解压。

vim ~/.bash_profile。

export M2_HOME="/Users/during/Documents/Software/apache-maven-3.5.0"

export PATH="$M2_HOME/bin:$PATH"

# 如果没有配置过JAVA_HOME,还需要导出JAVA_HOME
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents

使环境变量生效

source ~/.bash_profile 

mvn -v 查看 Maven 否安装成功

下面开始我们的正式之旅~

这里我们使用Intellij IDEA编辑器.创建一个项目

image

左边有很多选项,这里我们就选择Spring Initializr.

我们将项目的SDK选择为1.8.

点击下一步

image

group是maven管理项目包时用作区分的字段.

artifact:一般是项目名或者模块名。

包名根目录=group+artifact

其余的可以直接默认的.

image

我们使用Spring Boot1.5.17.

这里我们先勾选 web.

最后我们选择保存路径即可.

当然如果你是第一次使用,会使用Maven下载大量的包。需要很长时间.建议更换成阿里云或者其他国内镜像

.test
├── pom.xml # maven的配置文件
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── webhuang
│   │   │           └── test
│   │   │               └── TestApplication.java # 项目的启动文件
│   │   └── resources # 项目的一些资源
│   └── test # 测试文件

我们直接进入TestApplication.java 通过编辑器启动项目

在代码编辑区域右键 点击 'Run TestApplication'.

当然你也可以在项目根目录使用 mvn spring-boot run 启动

image

可以看到启动在8080端口下了,打开浏览器 (http://localhost:8080)
image

现在我们让浏览器显示出Hello,World.

我们在同目录下创建一个 HelloController.java 文件

package com.webhuang.test;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @GetMapping("/")
    public String index() {
        return "hello, World";
    }
}

然后我们重启项目.再次打开浏览器.显示出hello,world了.

本文的目的不是打印出 hello,world 这么简单的咯.

而是做一套API接口,实现以下功能

请求Method 请求URL 功能
POST /insert 插入一条数据
GET /get 获取指定一条数据
GET /list 查看数据列表
POST /delete 删除一条指定数据

由于需要数据持久保存 我们要用到Mysql进行数据存储.

需要引用两个包. 在项目根目录下的pom.xml下dependencies中增加这两个包

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

不要忘记重新导入这些包.在编辑器中有快捷方式。
image

我们还需配置mysql连接信息

我们将 application.properties 改为 application.yml

使用yml格式 使配置项更加美观

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/dbtest
    username: root
    password:
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

jpa.hibernate.ddl-auto=update

第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。

接着去创建一个实体类 Data (src/main/java/com.webhuang.test/Data.java)

package com.webhuang.test;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Data {

    @Id
    @GeneratedValue
    private Integer id;

    private String data;

    public Data() {

    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}

在下次启动我们项目的时候就会自动创建一张data表.

由于这里只是对此框架进行一个初步的学习,并不使用复杂的项目结构.因此把所有文件都写在同一目录

我们创建一个DataRepository.java,这里仅仅继承JpaRepository

package com.webhuang.test;

import org.springframework.data.jpa.repository.JpaRepository;

public interface DataRepository extends JpaRepository<Data, Integer> {

}

好了,现在来编写API接口.创建一个 ApiController.java

package com.webhuang.test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class ApiController {

    // 自动导入DataRepository
    @Autowired
    private DataRepository dataRepository;

    /**
     * 获取数据列表
     * @return List<Data>
     */
    @GetMapping(value = "/list")
    public List<Data> list() {
        return dataRepository.findAll();
    }

    /**
     * 通过id获取一条数据
     * @param id 数据id
     * @return Data
     */
    @GetMapping(value = "/get")
    public Data get(@RequestParam(value = "id", required = false, defaultValue = "0") Integer id) {
        return dataRepository.findOne(id);
    }

    /**
     * 插入一条数据
     * @param content 数据内容
     * @return Data
     */
    @PostMapping(value = "/insert")
    public Data insert(@RequestParam(value = "data", defaultValue = "") String content) {
        Data data = new Data();
        data.setData(content);
        return dataRepository.save(data);
    }

    /**
     * 删除一条数据
     * @param id 数据id
     */
    @PostMapping(value = "/delete")
    public void delete(@RequestParam(value = "id", required = false, defaultValue = "0") Integer id){
        dataRepository.delete(id);
    }
}

如果你有 php 或者 python的开发经验 你会发现这些ORM操作都一样.很容易入手.这里我也就不过多解释这些代码了.

代码编写完成,重启项目.我们来测试一下这些接口:

  • 插入数据
$ curl -X POST -d data=test "http://localhost:8080/insert"
> {"id":2,"data":"test"}
  • 数据列表
> curl -X GET "http://localhost:8080/list"
> [{"id":1,"data":"first"},{"id":2,"data":"test"}]

这里id为1的数据是我自己手动加入库中的.

  • 获取数据
$ curl -X GET "http://localhost:8080/get?id=2"
> {"id":2,"data":"test"}
  • 删除数据
# 删除数据没用返回值
$curl -X POST -d id=1 "http://localhost:8080/delete"

对于我这个0JAVA基础的人.照葫芦画瓢写出这几个接口.花了4个多小时.当深入了解了一门语言之后,再去掌握其他语言就很容易上手了.当然这里也多亏了Spring Boot的开发者.让这些操作变得如此简洁方便.

之后会花时间去研究Spring大家族的.其目的就是开头所说.将一些Java实践较好的东西,引入php.

也同样希望每一个PHP开发者完善我们的生态。让更多大型项目中也有我们的身影.

写作于: 2018年10月30日22:13

评论

还没有任何评论,你来说两句吧