简介
基于spring boot的整体使用介绍,文档将持续和spring boot发布版本同步更新
spring framework 学习参考 https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/
系统要求
Spring Boot 2.2.0RELEASE
Build Tool | Version |
---|---|
Maven | 3.3+ |
Gradle | 5.x (4.10 is also supported but in a deprecated form) |
Name | Servlet Version |
---|---|
Tomcat 9.0 | 4.0 |
Jetty 9.4 | 3.1 |
Undertow 2.0 | 4.0 |
Spring Boot支持以下嵌入式servlet容器
spring boot 2.2亮点
RSocket是一种用于反应式应用程序的新的网络协议。RSocket是在华盛顿特区举行的SpringOne平台会议上宣布的,是一种新的第7层语言无关的应用网络协议。它是一种基于Reactive Streams背压的双向,多路复用,基于消息的二进制协议。它由Facebook,Netifi和Pivotal等工程师开发,提供Java,JavaScript,C ++和Kotlin等实现。
该协议专门设计用于与Reactive风格应用配合使用,这些应用程序基本上是非阻塞的,并且通常(但不总是)与异步行为配对。使所谓Reactive背压: 即发布者无法向订户发送数据直到该订户已经准备就绪的想法,这是与“异步”的关键区别。
反应式编程(响应式reactive)是Java中高效应用的下一个前沿。但有两个主要障碍 - 数据访问和网络。RSocket旨在解决后一个问题,而R2DBC旨在解决前者问题。
在微服务式应用程序中,HTTP是被广泛用作通信协议。,但HTTP针对的是一个与移动世界截然不同的世界而设计的。
我们有iPhone和Android手机,我们收听通知,所以我们不一定要求一些请求立即得到回复,我们在运动时使用智能手表,它与后端服务器交互,为我们提供统计数据; 我们让Smart助手与后端服务器进行交互。所有这些互动模型都是我们称之为互联体验的一部分。HTTP并不是真的为此设计的。
HTTP的一个重要问题是,它强迫客户端负担起所有责任来处理不同类型的错误上,包括重试逻辑,超时,断路器等。使用Reactive架构构建的应用程序可以提高效率并扩展。
RSocket与HTTP的不同之处在于它定义了四种交互模型:
Fire-and-Forget:优化请求/响应,在不需要响应时非常有用,例如非关键事件日志记录。
请求/响应:当您发送一个请求并收到一个响应时,就像HTTP一样。即使在这里,该协议也具有优于HTTP的优点,因为它是异步和多路复用的。
请求/流:类似于返回集合的请求/响应,集合被回送而不是查询直到完成,因此例如发送银行帐号,用实时的帐户事务流进行响应。
迁移
如果要从早期版本的Spring Boot升级,请查看 项目Wiki上的“迁移指南”, 其中提供了详细的升级说明。另请查看 “发行说明”,了解每个版本的“新的和值得注意的”功能列表。
升级到新功能版本时,某些属性可能已重命名或删除。Spring Boot提供了一种在启动时分析应用程序环境和打印诊断的方法,还可以在运行时临时迁移属性。要启用该功能,请将以下依赖项添加到项目中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<scope>runtime</scope>
</dependency>
添加到环境后期的属性(例如使用时 @PropertySource
)将不会被考虑在内。
完成迁移后,请确保从项目的依赖项中删除此模块。
项目创建
这里使用idea,创建一个spring boot 项目
下一步创建一个名叫test的项目
下一步选择jar包
developer tools 全选没有用过lombok就不要选了
spring devtools 有时启动会打印INFO关于glassfish包依赖不存在,是因为开发工具未能正确查找依赖造成,不影响使用
参考: https://github.com/spring-projects/spring-boot/issues/9802
web选择
SQL选择
- 数据库选择先为MySQL Driver (oracle 是没有的需要自己导入)
- hibernate为:spring data JPA
- mybatis为: mybatis FrameWork
最基本的一个spring boot 创建完成
spring boot maven
官方:https://docs.spring.io/spring-boot/docs/current/maven-plugin/
Spring Boot Maven插件在Maven中提供Spring Boot支持,允许您打包可执行jar或war档案并“就地”运行应用程序。
概述
- spring-boot:run运行Spring Boot应用程序(不需要配置和使用)。
- spring-boot:repackage 打包你的jar / war是可执行的(编译可执行文件)。
- spring-boot:start和spring-boot:stop管理Spring Boot应用程序的生命周期(即集成测试)。
- spring-boot:build-info生成可由执行器使用的构建信息(例如编译时间,项目名)。
repackage配置
1.spring boot配置
模块用作另一个模块的依赖项,则需要为重新打包的模块提供分类器,依赖模块同步打包,但会保留之前的编译的包
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- 程序入口main -->
<configuration>
<mainClass>com.cn.spring.web.WebApplication</mainClass>
<layout>JAR</layout>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
2.spring cloud配置
主项目和辅助项目同步重新打包
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${maven-jar-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
<phase>package</phase>
<configuration>
<classifier>task</classifier>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>task</classifier>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
start和stop
1.配置测试随机端口
Spring Boot测试集成的一个很好的特性是它可以为Web应用程序分配一个空闲端口。当使用插件的起始目标时,Spring Boot应用程序将单独启动,因此很难将实际端口传递给集成测试本身。
下面的示例展示了如何使用build-helper-plugin实现相同的功能:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<id>reserve-tomcat-port</id>
<goals>
<goal>reserve-network-port</goal>
</goals>
<phase>process-resources</phase>
<configuration>
<portNames>
<portName>tomcat.http.port</portName>
</portNames>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>pre-integration-test</id>
<goals>
<goal>start</goal>
</goals>
<configuration>
<arguments>
<argument>--server.port=${tomcat.http.port}</argument>
</arguments>
</configuration>
</execution>
<execution>
<id>post-integration-test</id>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<test.server.port>${tomcat.http.port}</test.server.port>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</build>
2.跳过测试(打包不会添加测试类,但会编译)
<project>
<properties>
<skip.it>true</skip.it>
<start-class>com.xxx.xxx.Application</start-class>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<!-- 参考: https://docs.spring.io/spring-boot/docs/current/maven-plugin/ -->
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--程序入口启动类-->
<mainClass>${start-class}</mainClass>
</configuration>
<executions>
<!-- 打包 -->
<!--参考 https://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/repackage-classifier.html-->
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
<!--跳过集成测试-->
<execution>
<id>pre-integration-test</id>
<goals>
<goal>start</goal>
</goals>
<configuration>
<skip>${skip.it}</skip>
</configuration>
</execution>
<execution>
<id>post-integration-test</id>
<goals>
<goal>stop</goal>
</goals>
<configuration>
<skip>${skip.it}</skip>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
skip和skipTests区别 (亲测效果一样不知道为什么,都是跳过运行测试,但仍然编译它们)官方使用skip
<!-- 将其设置为true跳过运行测试,但仍然编译它们-->
<skipTests>${skipTests.it}</skipTests>
<!--将其设置为true禁用运行测试和编译测试-->
<skip>${skip.it}</skip>
注意:测试类不可为空必须有内容
build-info
<execution>
<goals>
<goal>build-info</goal>
</goals>
<configuration>
<additionalProperties>
<encoding.source>UTF-8</encoding.source>
<encoding.reporting>UTF-8</encoding.reporting>
<java.source>${maven.compiler.source}</java.source>
<java.target>${maven.compiler.target}</java.target>
</additionalProperties>
</configuration>
</execution>
排除依赖
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>com.foo</groupId>
<artifactId>bar</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
更多参数配置参考官方
appliaction配置文件
默认项目会创建一个appliaction.properties文件 ,使用yaml格式的更直观些。
一般是这样采用dev开发环境和 prod上线环境 ,切换修改spring.profiles.active
banner.txt为控制台启动图标配置,如果想自己制作 链接
┬ ┬┌─┐┬ ┬ ┌─┐ ┬ ┬┌─┐┬─┐┬ ┌┬┐
├─┤├┤ │ │ │ │ ││││ │├┬┘│ ││
┴ ┴└─┘┴─┘┴─┘└─┘ └┴┘└─┘┴└─┴─┘─┴┘
spring-boot: ${spring-boot.version}
application.yml
注意:如果使用spring-data-starter-jdbc,spring-data-starter-redis 等,spring boot2.2jpa不配置将无法启动,
repositories参考Repository类,请勿使用spring.main.allow-bean-definition-overriding=true
#spring data
data:
jdbc:
repositories:
enabled: false
redis:
repositories:
enabled: false
或指定basePackages例如:
@EnableJpaRepositories(basePackages = "")
@EnableJdbcRepositories(basePackages = "") //如果无直接操作jdbc的话关闭
@EnableRedisRepositories(basePackages = "") //如果无直接操作redis的话关闭
大部分为默认配置好的不需要配置
spring:
profiles:
active: dev
#数据库连接池:使用hikari,spring boot 提供默认配置,其它连接池需配置
datasource:
type: com.zaxxer.hikari.HikariDataSource
#使用默认值参考: HikariConfig类或github上的HikariCP https://github.com/brettwooldridge/HikariCP
#maximum-pool-size参考: https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing
transaction:
#事务等待2分钟超时
default-timeout: PT2M
#提交的事务失败回滚
rollback-on-commit-failure: true
#文件限制
servlet:
multipart:
max-file-size: 100MB
max-request-size: 100MB
#tocmat
server:
servlet:
context-path: /
session:
#1小时
timeout: PT1H
tomcat:
#主要是为了识别代理ip地址
#从中提取远程 ip 的 http 标头的名称
remote-ip-header: X-FORWARDED-FOR
#用于识别协议(HTTP 或 HTTPS)
protocol-header: X-Forwarded-Proto
application.yml添加hibernate配置
#hibernate JPA
jpa:
database: MYSQL
#在启动时初始化架构
generate-ddl: true
#注册OpenEntityManagerInViewInterceptor拦截器
open-in-view: true
hibernate:
ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL8Dialect
current_session_context_class: org.springframework.orm.hibernate5.SpringSessionContext
enable_lazy_load_no_trans: true
#使用@Transient注解操作异常问题解决
event:
merge:
entity_copy_observer: allow
mybatis 参考:链接
application-dev.yml和application-prod.yml
差不多一样就是地址 用户名 密码会变动
#测试环境
spring:
config:
#名称可以在application.yml 切换
name: dev
datasource:
url: 地址
username: 用户名
password: 密码
driverClassName: com.mysql.cj.jdbc.Driver
sql-script-encoding: UTF-8
server:
port: 80
Main主类
@SpringBootApplication
//开启事务
@EnableTransactionManagement
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
}
默认为 @ComponentScan(basePackageClasses = WebApplication.class) 无需配置
1. 默认组件的扫描
默认会使用basePackageClasses基于WebApplication类所在包进行组件扫描
@ComponentScan(basePackageClasses = WebApplication.class)
等同于WebApplication在com.cn.demo包下等于@ComponentScan(basePackages ="com.cn.demo")
2.需要重新定义扫描的组件
1.移动WebApplication到com.cn包下
2.使用@ComponentScan(basePackages ="xxx.xxx.xxx")
- 如果使用了basePackages了例如:使用hibernate进行数据访问层的注入还需要配置basePackages
- 例如@EnableJpaRepositories(basePackages ="xxx.xxx.xxx")不配置的话会注入失败。
建议移动WebApplication
配置完成可以启动
下一篇:spring boot基础功能