主要内容
- Spring Boot技术栈
- 介绍Spring Boot完整的技术栈(图片格式,暂时没有上传)
- Web应用
- 数据操作
- 消息
- 测试
- 运维管理
- 介绍Spring Boot完整的技术栈(图片格式,暂时没有上传)
- Spring Boot构建方式
- 图形化
- 命令行
- Spring Boot多模块应用
- 构建分层、多模块应用
- Spring Boot运行方式
- IDEA
- 命令行
- Maven插件
- Spring Boot简单应用
- Spring Web MVC
- Spring Web Flux技术
- 编程简单应用
- Spring Boot三大特性
- 自动装配
- 嵌入式容器
- 为生产准备的特性
定义
- 应用
- 功能性
- 系统所设计的业务范畴
- 非功能性
- 安全
- 性能
- 监控
- 数据指标(CPU利用率、网卡使用率)
- production-ready(为产品而准备)
- 功能性
- 特性
- 约定大于配置
- 大多数组件不需要自行配置,而是自动装配
- 简化开发
- 例如maven
- 独立Spring容器,不需要外部依赖
- 例如依赖Tomcat
- 嵌入式Tomcat、Jetty
- 约定大于配置
- 外部配置
- 启动参数
- 配置文件
- 环境变量
- 外部应用
- Servlet应用
- Spring Web MVC
- Spring Web Flux
- WebSocket
- WebService
Spring Boot构建方式
- 图形化方式
- 命令行方式(Maven)
mvn archetype:generate -DgroupId=com.bai -DartifactId=first-spring-boot-app -Dversion=1.0.0-SNAPSHOT -DinteractiveMode=false
- 修改
pom
文件
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
- 修改
App.java
1 | package com.bai; |
Q : 为什么new SpringApplication
的时候需要把App.class
传进去
A : @SpringBootApplication
打在了App这个类上,App就相当于配置类
注意点
- 启动时容器为内置Netty
1 | INFO 10206 --- [ctor-http-nio-1] r.ipc.netty.tcp.BlockingNettyContext : Started HttpServer on /0:0:0:0:0:0:0:0:8080 |
一些理论
Mono 和 Flux 是 Reactive streams 的发布者实现。
body
Mono
0-1元素
Optional(Java8)
1
2Collection<User> users=userRepository.findAll();
Mono<Collection<User>> userMono=Mono.just(users);
Flux
0-N元素
类似于Iterable或者Collection
1
2Collection<User> users=userRepository.findAll();
Flux<User> userFlux=Flux.fromIterable(users);Req -> WebFlux -> 1-N线程执行函数式任务
推的方式
Mono和Flux都是Publisher。
Publisher -> publish(1)
Subscription(1):订阅消息
Subs(A)#onNext() -> Subs(B)#onNext() -> Subs(C)#onNext()
Java9里面API称之为Flow,可以理解为责任链,也叫观察者模式。
Reactive是推模式
Iterable是拉模式
补充
编码
- 如果方法返回的是集合,尽量返回
- 原子的
- 只读的
书籍
- 《Effective Java》- 第二版
架构
- Spring-webFlux不能和Spring-webmvc同时使用
资料
1 | //官方示例(错误) |
1 | //正确版本 |
构建多模块应用
- 修改主工程类型 jar -> pom
1 | <packaging>pom</packaging> |
- 新建web工程,将遗留代码全部移动到web/java目录下
- 再从web工程,独立出model工程
- 将web工程依赖model工程
- 重复步骤3,独立出persistence
- 再从persistence添加model的依赖
- 最终依赖关系 web -> persistence -> model
补充
1 | <dependency> |
运行方式
- IDE
- 命令行
- Maven脚本
构建可执行jar
- 项目根路径下执行
mvn -Dmaven.text.skip -U clean package
cd web/target
java -jar web-1.0.0-SNAPSHOT.jar
no main manifest attribute, in web-1.0.0-SNAPSHOT.jar?
jar包里有MANIFEST.MF,有Main-Class的属性,API:java.util.jar.Manifest#getAttributes
需要一个Spring Boot的插件。
1 | <!--web下的pom文件--> |
会保找不到插件,需要添加插件仓库
1 | <!--总项目的pom文件--> |
构建方式从jar切换为war
- 修改web下pom文件
1 | <packaging>war</packaging> |
方式一
- 创建
webapp/WEB-INF
(相对于src/main
目录) - 新建空的
web.xml
上两步是为了绕过war插件的限制
方式二
1 | <plugin> |
启动多个
正常启动一个后,默认端口被占用,这时候需要用其它端口来启动服务。
java -jar web-1.0.0-SNAPSHOT.war --server.port=0
--server.port=0
随机挑选一个可用端口
server.por
源码位置:
org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration
-> ServerProperties
类中的prefix
是server
,port
就是下面的属性。
maven启动
- 项目跟路径下执行
mvn spring-boot:run
- 如果报本地仓库没有则执行:
mvn -Dmaven.test.skip -U clean install
,然后再启动就可以了。
- 如果报本地仓库没有则执行:
补充
- 解压
web-1.0.0-SNAPSHOT
BOOT-INF
- 这是Spring Boot1.4开始才有的。
- 当使用依赖或者插件时,如果版本是Milestone,需要增加
1 | <pluginRepositories> |
META-INF/MANIFEST.MF
里面有指定- Main-Class
- Start-Class
1 | Main-Class: org.springframework.boot.loader.JarLauncher |
- 除了jar或者war启动的方式,还有目录启动方式
- 可以帮助解决过期的jar不支持Spring Boot新方式,比如老版本的MyBatis
- 如果是jar包
cd /web/target/web-1.0.0-SNAPSHOT
java org.springframework.boot.loader.JarLauncher
- 如果是war包
cd /web/target/web-1.0.0-SNAPSHOT
java org.springframework.boot.loader.WarLauncher
- 如果是jar包
- 可以帮助解决过期的jar不支持Spring Boot新方式,比如老版本的MyBatis
其它
自动装配模式:xxxAutoConfiguration
不同版本中名称可能会发生变化。
问题及回答
Q:webFluxConfiguration里面的映射路径和controller里面的路径有什么区别?
A:基本上没有区别,注意不要重复定义或URL语义有重复。
Q:webFlux不是跟MVC不能一起吗,怎么启动了
A:spring-boot-starter-webmvc和spring-boot-starter-webflux可以放在同一个应用,可是webFlux不会工作,默认使用webmvc,webFlux不会被采用。其实webFlux是兼容Annotation驱动,比如@RequestMapping
。
Q:webFlux可以定义rest吗
A:可以。
Q:Spring的老项目迁移到spring-boot,如何操作
A:老的XML方式采用@ImportResource
导入
Q:嵌入式Tomcat如何调优
A:两种方式:
- 通过application.properties文件调整参数
- 通过接口回调:
TomcatConnectorCustomizer
、TomcatContextCustomizer
。