Spring Boot初了解
最近这段时间一直在忙于开发,今天忙里偷闲更新一篇博客吧.
偶尔在找一些学习资料的时候,总是发现服务治理,服务发现,微服务架构这些高大上的词.但点进去一看实践方式都是使用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.
点击下一步
imagegroup是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)
现在我们让浏览器显示出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开发者完善我们的生态。让更多大型项目中也有我们的身影.