1、SpringBoot的角色:
SpringCloud:构建springBoot的分布式环境
SpringBoot:快速构建Spring应用(承上启下)
Spring Framework:spring框架
2、SpringBoot 2.0 新特性:
编程语言:Java 8+
底层框架:Spring Framwork 5.0.x
全新特性:Web Flux
函数编程:Java 8 Lambda
响应编程:Reactive Streams
异步编程:servlet 3.0 或者 Asyc NIO
3、构建项目:
图形化方式:http://start.spring.io
命令行方式:maven
3.1 命令行方式
命令行创建maven:
mvn archetype:generate -DinteractiveMode=false(true为交互式) -DgroupId=com.tian -DartifactId=first-app-by-maven -Dversion=1.0.0-SNAPSHOT
这里我们采用非交互式,cmd打开dos命令窗口,输入:
mvn archetype:generate -DinteractiveMode=false -DgroupId=com.tian -DartifactId=test-demo-springboot -Dversion=0.0.1-SNAPSHOT
创建完成,Idea 导入项目(Maven ),并修改pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.tian</groupId>
<artifactId>demo-springboot2</artifactId>
<packaging>jar</packaging>
<version>1.0.0-SNAPSHOT</version>
<name>demo-springboot2</name>
<url>http://maven.apache.org</url>
<dependencies>
<!-- springboot web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
修改启动类:com.tian.App
package com.tian;
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);
}
}
创建com.tian.web.controller.HolleController(注意:放入启动类的子包)
package com.tian.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HolleController {
@GetMapping
public String hello(){
return "hello,world";
}
}
启动App.java,浏览器访问:localhost:8080 如下图(成功):
3.2 图形化界面创建Spring Boot项目(http://start.spring.io)
参数(可根据实际情况修改):
Project:Maven Project
Language:Java
Spring Boot:2.2.1
Group:com.tian
Artifact:demo-springboot1
Dependencies:Reactive Web
创建完成。IDEA导入项目(Maven方式导入),并运行启动类:com.tian.demospringboot1.DemoSpringboot1Application
成功创建项目。
4、第一个Spring Boot项目实例
总包结构:
创建用户模型:com.tian.demospringboot1.domain.User
package com.tian.demospringboot1.domain;
/*
* 用户模型
*/
public class User {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer 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 + '\'' +
'}';
}
}
仓储:com.tian.demospringboot1.repository
package com.tian.demospringboot1.repository;
import com.tian.demospringboot1.domain.User;
import org.springframework.stereotype.Repository;
import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
/**
* {@link User} {@link Repository}
*/
@Repository
public class UserRepository {
private final ConcurrentHashMap<Integer, User> map=new ConcurrentHashMap<>();
private final static AtomicInteger idGenerator=new AtomicInteger();
public boolean save(User user){
Integer id=idGenerator.incrementAndGet();
user.setId(id);
return map.put(id,user)==null;
}
public Collection<User> query(){
return map.values();
}
}
Web:com.tian.demospringboot1.controller
package com.tian.demospringboot1.controller;
import com.tian.demospringboot1.domain.User;
import com.tian.demospringboot1.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collection;
@RestController
public class UserController {
private final UserRepository userRepository;
@Autowired
public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}
@RequestMapping("/person/save")
public User save(User user) {
if (userRepository.save(user)) {
System.out.println("用户对象保存成功");
}
return user;
}
@RequestMapping("/person/query")
public Collection<User> query() {
return userRepository.query();
}
}
运行启动类:Postman 测试
插入数据:
修改参数,多次插入
查询数据:
路由器函数:com.tian.demospringboot1.config
package com.tian.demospringboot1.config;
import com.tian.demospringboot1.domain.User;
import com.tian.demospringboot1.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
public class RouterFunctionConfiguration {
/**
* Servlet
* 请求接口:ServletRequest或者HttpServletRequest
* 相应接口 :ServletResponse或者HttpServletResponse
*Sping5.0重新定义了服务请求和响应接口
* 请求接口:ServerRequest
* 响应接口:ServerResponse
*即可支持Servlet规范,也可支持自定义比如Netty(Web Service)
*/
@Bean
@Autowired
public RouterFunction<ServerResponse> PersonFindAll(UserRepository userRepository){
return RouterFunctions.route(RequestPredicates.GET("/person/find/all"),
request -> {
//返回的对象
Collection<User> users=userRepository.query();
Flux<User> userFlux=Flux.fromIterable(users);
return ServerResponse.ok().body(userFlux,User.class);
}
);
}
}
运行启动类 Postman测试(需重新插入数据),输入对应的URL测试结果:
5、多模块Spring Boot项目:
分别创建子模块web、persistence、model(根项目-new-module...):
将对应的类放入对应模块:
删除根项目的src,并添加依赖:
Web-->persistence-->model
Persistence pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>demo-springboot1</artifactId>
<groupId>com.tian</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>persistence</artifactId>
<dependencies>
<dependency>
<artifactId>model</artifactId>
<groupId>com.tian</groupId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
web pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>demo-springboot1</artifactId>
<groupId>com.tian</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>web</artifactId>
<dependencies>
<dependency>
<artifactId>persistence</artifactId>
<groupId>com.tian</groupId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
运行启动类postman测试。
6、Spring Boot项目打包:
传统打包方式:
Jar包:第二方或第三方引用
war包:Tomcat等容器
ear包: 企业级模式中,不常见
Spring Boot 打包
构建jar包
构建war包
指定main-class
Cmd打开dos命令:
mvn -Dmaven.test.skip -U clean package
原因:项目重构后,main class移动到 web模块
所以将根项目的pom.xml 的:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
剪切到web模块的pom.xml文件中
重新执行:mvn -Dmaven.test.skip -U clean package 成功。
启动:
Postman测试。
修改web pom.xml 修改为war包(默认为jar包)
<packaging>war</packaging> |
Dos命令执行:mvn -Dmaven.test.skip -U clean package
构建如下结构:
Dos命令执行:mvn -Dmaven.test.skip -U clean package
运行war包:
Postman测试。
Spring Boot运行模式:
模式类型:
IDEA方式
Jar/war方式
Maven插件模式
Maven 插件模式:
安装插件:mvn -Dmaven.test.skip -U clean install
Mvn spring-boot:run
Main class 在web里面,所以进入web 继续运行
启动成功,postman测试。