spring全家桶系列之spring boot 2.2-基礎配置(一)

簡介


基於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檔案並“就地”運行應用程序。

 概述

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章