簡介
基於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基礎功能