大纲
1. springBoot 2.0简介
2. 开发环境简介及部分重要配置
3. 实现功能大纲
4. 构建单模块项目
5. 重构多模块项目
5.1 创建model, persistence, web三个子模块工程对应module
5.2 添加依赖关系
5.3 编写代码:User实体类,UserRepository数据操作类,UserController类(Web MVC形式),RouterFunctionConfiguration类(Web Flux形式)
5.4 启动应用
6. 项目打包
7. 运行模式
8. IDEA快捷键
1. springBoot 2.0简介
Spring Boot是用来简化Spring应用初始搭建以及开发过程的全新框架,被认为是Spring MVC的“接班人”,和微服务紧密联系在一起,Spring Boot 是学习Spring Cloud的基础。
springBoot 2.0基于 Spring Framework 5.0版本,而 Spring Framework 5.0遵守jdk8和Java EE 7规范,基本上,这意味着以前的JDK和Java EE版本不再受支持了。
2. 开发环境简介及部分重要配置
2.1 操作系统:Windows 10
2.2 jdk:java version "1.8.0_191"_x64
2.3 maven:Apache Maven 3.5.4
在apache-maven-3.5.4\conf路径下修改settings.xml文件,配置国内镜像中央仓库。
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
2.4 开发工具:IDEA
2.4.1 IDEA 配置 maven 下载源码,以便开发时查看调用jar包的源码。
2.4.2 IDEA 配置 maven 路径
3. 实现功能大纲
3.1 定义用户模型:ID、名称
3.2 客户端发送 POST 请求,创建用户(Web MVC形式)
3.3 客户端发送 GET 请求,获取所有用户(Web Flux形式——SpringWebflux是SpringFramework5.0添加的新功能)
4. 构建单模块项目
构建项目分为2种方式:图形化方式和Maven命令行方式。
4.1 图形化方式构建单模块项目
4.1.1 进入网址http://start.spring.io,填写项目信息“my-first-app”(Dependencies需要输入“reactive web”之后弹出下拉框后,然后选中),并点击下载源码。
4.1.2 IDEA导入工程
至此,以图形化方式构建单模块项目已完成。
4.2 Maven命令行方式构建单模块项目
4.2.1 在cmd下指定工作空间文件夹下执行命令:
mvn archetype:generate -DinteractiveMode=false -DgroupId=com.springboot.user -DartifactId=my-first-app-by-maven -Dversion=1.0.0SNAPSHOT
DinteractiveMode: true-交互模式,false-非交互模式
4.2.2 IDEA导入工程,操作类似3.1.2,这里不再赘述,直接展示最后导入成功工具中的图片
至此,以命令行方式构建单模块项目已完成。
5. 重构多模块项目
5.1 创建子模块工程对应module
- 模型层: model-管理模型对象
- 持久层: persistence-管理模型的存储以及获取
- 表示层: web-给用户展示rest接口或者HTML页面
5.1.1 创建 model 子模块
生成的目录结构如下图:
5.1.2 创建 persistence 子模块,创建步骤参考5.1.1,结果如下
5.1.3 创建 web 子模块,创建步骤参考5.1.1,结果如下
至此,创建model, persistence, web三个子模块工程对应module完成。
5.2 添加依赖关系
5.2.1 修改父工程pom文件(my-first-app-by-maven\pom.xml)
1. 添加spring-boot-starter-parent:Spring Boot项目通常使用spring-boot-starter-parent作为pom.xml中的父项,用来提供相关的Maven默认依赖。使用它之后,常用的包依赖可以省去version标签。
2. 添加spring-boot-starter-webflux:WebFlux的依赖。
4. 添加spring-boot-starter-test:单元测试的依赖。
5. 添加reactor-test:Reactor的测试依赖。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
5.2.2 修改 web 子模块pom文件(web\pom.xml)
由于web需要依赖 persistence 子模块,所以添加 persistence 子模块的依赖。
spring-boot-maven-plugin中的mainClass标签值来自于App.java的包路径。
<dependencies>
<dependency>
<artifactId>persistence</artifactId>
<groupId>com.springboot.user</groupId>
<version>1.0.0SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.springboot.user.App</mainClass>
</configuration>
</plugin>
</plugins>
</build>
5.2.3 修改 persistence 子模块pom文件(persistence\pom.xml)
由于web需要依赖 model 子模块,所以添加 model 子模块的依赖。
<dependencies>
<dependency>
<artifactId>model</artifactId>
<groupId>com.springboot.user</groupId>
<version>1.0.0SNAPSHOT</version>
</dependency>
</dependencies>
5.3 更新maven,重新reimport
至此,添加依赖关系完成。
5.4 model 子模块添加User类
路径为:com.springboot.user.domain.User.java
/**
* 用户模型
*/
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
5.5 persistence 子模块添加 UserRepository 类
路径为:persistence\src\main\java\com\springboot\user\repository\UserRepository.java
import com.springboot.user.domain.User;
import org.springframework.stereotype.Repository;
import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicInteger;
/**
* {@link User} {@link Repository}
*/
@Repository
public class UserRepository {
/**
* 采用内存型的存储方式 -> Map
*/
private final ConcurrentMap<Integer, User> repository = new ConcurrentHashMap<>();
/**
* id生成器
*/
private final static AtomicInteger idGenerator = new AtomicInteger();
/**
* 保存用户对象
* @param user {@link User}对象
* @return 如果保存成功,返回<code>true</code>,
* 否则,返回<code>false</code>
*/
public boolean save(User user){
// id 从 1 开始
Integer id = idGenerator.incrementAndGet();
user.setId(id);
return repository.put(id, user) == null;
}
/**
* 查找所有用户
*/
public Collection<User> findAll(){
return repository.values();
}
}
5.6 web 子模块
5.6.1 代码移植
1. 将src目录下的com\springboot\user\App.java移植至web\src\main\java\com\springboot\user\App.java下,并修改内容,如下图。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App
{
public static void main( String[] args )
{
SpringApplication.run(App.class, args);
}
}
2. 将src的test目录下的com\springboot\user\AppTest.java移植至web\src\test\java\com\springboot\user\AppTest.java下。
3. 将src目录删除。
5.6.2 创建webapp/WEB-INF/web.xml文件
注意:此步是为打war包做准备,默认是打的jar包,若不打war包,则此步可忽略。
5.6.3 创建 UserController 类,路径为:web\src\main\java\com\springboot\user\controller\UserController.java
import com.springboot.user.domain.User;
import com.springboot.user.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
private final UserRepository userRepository;
/**
* 框架对userRepository变量进行初始化
* @param userRepository
*/
@Autowired
public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}
/**
* 【客户端发送 POST 请求,创建用户(Web MVC形式)】
*/
@PostMapping("person/save")
public User save(@RequestParam String name){
User user = new User();
user.setName(name);
if (userRepository.save(user)){
System.out.println("用户对象"+user+"保存成功!");
}
return user;
}
}
5.6.4 创建 RouterFunctionConfiguration 类,路径为web\src\main\java\com\springboot\user\config\RouterFunctionConfiguration.java
import com.springboot.user.domain.User;
import com.springboot.user.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Flux;
import java.util.Collection;
/**
* 路由器函数 配置
* Configuration 表示是一个配置对象,spring3及以后有,类似于java版的xml配置文件
*/
@Configuration
public class RouterFunctionConfiguration {
/**
* 在servlet中
* 请求接口:ServletRequest 或者 HttpServletRequest
* 相应接口:ServletResponse 或者 HttpServletResponse
* 在spring5.0中重新定义了服务端的请求和相应接口:
* 请求接口:ServerRequest
* 相应接口:ServerResponse
* 既可以支持 servlet 规范,也可以支持自定义,比如 Netty (Web Server)
* 以本例,
* 定义一个GET请求,并且返回所有的用户对象 URL: /person/find/all
* Flux 是 0-N 个对象集合
* Mono 是 0-1 个对象集合
* Reactive 中的 Flux 或者 Mono 是异步处理(非阻塞式)
* 集合对象基本上是同步处理(阻塞式)
* Flux 或者 Mono 都是Publisher(发布者)
* 【客户端发送 GET 请求,获取所有用户(Web Flux形式)】
*/
@Bean // 路由函数
@Autowired // 注入用户仓储,保证数据来源
public RouterFunction<ServerResponse> personFindAll(UserRepository userRepository){
return RouterFunctions.route(RequestPredicates.GET("/person/find/all"),// 此处的路由前面要有/
request -> {
// 返回所有的用户对象
Collection<User> users = userRepository.findAll();
Flux<User> userFlux = Flux.fromIterable(users);
return ServerResponse.ok().body(userFlux, User.class);
});//lambda表达式
}
}
至此,编写代码:User实体类,UserRepository数据操作类,UserController类(Web MVC形式),RouterFunctionConfiguration类(Web Flux形式)完成。
5.7 更新maven,重新reimport,构建项目并启动
可以优化日志打印,添加 application.yml 文件, 路径为:web\src\main\resources\config\application.yml
logging:
level:
root: trace
com.springboot.user: debug
org.springframework.security: warn
# 默认日志文件名
# file: log
# 默认日志路径
# path: ./log
# logback.xml路径,默认为classpath:logback.xml
# config: ./logback.xml
重新启动应用,可以看到发布的链接信息。
至此,项目编码完成,亦可启动项目应用。可以在 postman 工具中输入以下链接进行测试:
- http://localhost:8080/person/save?name=zhangsan1
- http://localhost:8080/person/save?name=zhangsan2
- http://localhost:8080/person/find/all
6. 项目打包
6.1 构建jar包
6.1.1-在cmd中进入工程目录下,执行命令
mvn -Dmaven.test.skip -U clean package
-Dmaven.test.skip: 跳过测试包
-U: 更新第三方包
6.1.2-执行命令运行jar包
java -jar web-0.0.1-SNAPSHOT.jar
6.2 构建war包
6.2.1-修改 web 子模块中的pom配置,添加packing标签。
注意:由于要发布war包,所以需要有webapp/WEB-INF/web.xml文件,参考5.6.2步骤
<!-- packaging 值默认是jar -->
<packaging>war</packaging>
6.2.2-在cmd中进入工程目录下,执行命令
mvn -Dmaven.test.skip -U clean package
6.2.3-执行命令运行war包
java -jar web-1.0.0SNAPSHOT.war
7. 运行模式
1. IDEA方式-开发过程中
2. JAR、WAR方式-线上或服务器上
3. maven插件方式-开发环境,但没有图形化操作界面(此种方式不常用)
3-1 在D:\AppFiles\10IDEAWorkSpace\first-app-demo下执行命令
mvn -Dmaven.test.skip -U clean install
3-2 在D:\AppFiles\10IDEAWorkSpace\first-app-demo\web下执行命令
mvn spring-boot:run
8. IDEA快捷键
1. alt+1,2,3,4,5-打开或关闭对应侧栏
2. ctrl+alt+[/]跳转或返回下一个IDEA工具
3. 文件之间跳转:
Ctrl+shift+A:
输入recent files ---> Ctrl+E
输入recent change files ---> Ctrl+shift+E
4. 重写toString方法:alt+insert,在弹出的框中输入toString
5. 导包:alt+enter
6. main函数:psvm
7. System.out.println:sout
参考链接
Spring Boot 2.0深度实践-初遇Spring Boot
解析spring-boot-starter-parent简介
在pom包中添加spring-boot-starter-test包引用
源码下载:https://download.csdn.net/download/sinat_31511255/11061288
最后,谢谢各位读者的耐心阅读,如有语句不通顺或者不准确的地方,大家也可以提提改善的意见!谢谢!(^__^)