天天看點

SpringBoot 開發入門—Springboot基礎架構

作者:DOKER

一、環境準備

Java:Spring Boot 3.0.2 需要 Java 17,并且與 Java 19 相容

Maven:Apache Maven 3.5 或更高版本相容

二、啟動器

以下應用程式啟動器由 Spring Boot 在該組下提供:org.springframework.boot

表 1.Spring 引導應用程式啟動器

名字 描述
spring-boot-starter 核心啟動器,包括自動配置支援、日志記錄和 YAML
spring-boot-starter-amqp 使用Spring AMQP和Rabbit MQ的入門
spring-boot-starter-aop 使用Spring AOP和AspectJ進行面向方面的程式設計的入門器
spring-boot-starter-artemis 使用 Apache Artemis 的 JMS 消息傳遞入門
spring-boot-starter-batch 使用彈簧批處理的啟動器
spring-boot-starter-cache 使用 Spring 架構緩存支援的入門工具
spring-boot-starter-data-cassandra 使用 Cassandra 分布式資料庫和 Spring Data Cassandra 的入門
spring-boot-starter-data-cassandra-reactive 使用 Cassandra 分布式資料庫和 Spring Data Cassandra Reactive 的入門
spring-boot-starter-data-couchbase 使用Couchbase面向文檔的資料庫和Spring Data Couchbase的入門
spring-boot-starter-data-couchbase-reactive 用于使用 Couchbase 面向文檔的資料庫和 Spring Data Couchbase Reactive 的入門
spring-boot-starter-data-elasticsearch 使用Elasticsearch搜尋和分析引擎以及Spring Data Elasticsearch的入門工具
spring-boot-starter-data-jdbc 使用Spring Data JDBC的入門器
spring-boot-starter-data-jpa 将 Spring Data JPA 與 Hibernate 一起使用的入門程式
spring-boot-starter-data-ldap 使用Spring Data LDAP的入門
spring-boot-starter-data-mongodb 使用MongoDB面向文檔的資料庫和Spring Data MongoDB的入門
spring-boot-starter-data-mongodb-reactive 使用MongoDB面向文檔的資料庫和Spring Data MongoDB反應式的入門
spring-boot-starter-data-neo4j 使用 Neo4j 圖形資料庫和 Spring Data Neo4j 的入門
spring-boot-starter-data-r2dbc 使用彈簧資料R2DBC的入門器
spring-boot-starter-data-redis 将 Redis 鍵值資料存儲與 Spring Data Redis 和 Lettuce 用戶端一起使用的入門
spring-boot-starter-data-redis-reactive 将 Redis 鍵值資料存儲與 Spring Data Redis 反應式和生菜用戶端一起使用的入門
spring-boot-starter-data-rest 使用Spring Data REST通過REST公開Spring Data Repository的入門程式
spring-boot-starter-freemarker 使用 FreeMarker 視圖建構 MVC Web 應用程式的入門器
spring-boot-starter-graphql 使用 Spring GraphQL 建構 GraphQL 應用程式的入門器
spring-boot-starter-groovy-templates 使用 Groovy 模闆視圖建構 MVC Web 應用程式的入門工具
spring-boot-starter-hateoas 使用Spring MVC和Spring HATEOAS建構基于超媒體的RESTful Web應用程式的入門
spring-boot-starter-integration 使用彈簧內建的啟動器
spring-boot-starter-jdbc 将 JDBC 與 HikariCP 連接配接池一起使用的入門
spring-boot-starter-jersey 使用 JAX-RS 和 Jersey 建構 RESTful Web 應用程式的入門工具。彈簧啟動啟動網的替代方案
spring-boot-starter-jooq 使用 jOOQ 通過 JDBC 通路 SQL 資料庫的入門工具。spring-boot-starter-data-jpa 或 spring-boot-starter-jdbc 的替代方案
spring-boot-starter-json 用于讀取和寫入 json 的入門器
spring-boot-starter-mail 使用Java Mail和Spring Framework的電子郵件發送支援的入門
spring-boot-starter-mustache 使用 Mustache 視圖建構 Web 應用程式的入門器
spring-boot-starter-oauth2-client 使用Spring Security的OAuth2 / OpenID Connect用戶端功能的入門
spring-boot-starter-oauth2-resource-server 使用Spring Security的OAuth2資源伺服器功能的入門
spring-boot-starter-quartz 使用石英排程程式的入門器
spring-boot-starter-rsocket 用于建構 RSocket 用戶端和伺服器的入門器
spring-boot-starter-security 使用彈簧安全性的入門
spring-boot-starter-test 用于測試Spring Boot應用程式的入門器,包括JUnit Jupiter,Hamcrest和Mockito等庫
spring-boot-starter-thymeleaf 使用 Thymeleaf 視圖建構 MVC Web 應用程式的入門器
spring-boot-starter-validation 将 Java Bean Validation 與 Hibernate Validator 結合使用的入門程式
spring-boot-starter-web 用于建構Web的入門工具,包括使用Spring MVC建構Web(包括RESTful)的應用程式。使用 Tomcat 作為預設的嵌入式容器
spring-boot-starter-web-services 使用 Spring Web 服務的入門器
spring-boot-starter-webflux 使用 Spring Framework 的響應式 Web 支援建構 WebFlux 應用程式的入門工具
spring-boot-starter-websocket 使用Spring Framework的MVC WebSocket支援建構WebSocket應用程式的入門工具

除了應用程式啟動器之外,以下啟動器還可用于添加生産就緒功能:

表 2.Springboot啟動器

名字 描述
spring-boot-starter-actuator 使用Spring Boot執行器的入門,該執行器提供生産就緒功能,可幫助您監視和管理應用程式

最後,Spring Boot 還包括以下啟動器,如果要排除或交換特定的技術方面,可以使用它們:

表 3.Springboot技術啟動器

名字 描述
spring-boot-starter-jetty 使用 Jetty 作為嵌入式 servlet 容器的入門工具。彈簧啟動啟動器-雄貓的替代品
spring-boot-starter-log4j2 使用 Log4j2 進行日志記錄的入門程式。彈簧引導啟動日志記錄的替代方案
spring-boot-starter-logging 使用回日志進行日志記錄的啟動器。預設日志記錄啟動器
spring-boot-starter-reactor-netty 使用 Reactor Netty 作為嵌入式反應式 HTTP 伺服器的入門程式。
spring-boot-starter-tomcat 使用 Tomcat 作為嵌入式 servlet 容器的入門工具。spring-boot-starter-web 使用的預設 servlet 容器啟動器
spring-boot-starter-undertow 使用 Undertow 作為嵌入式 servlet 容器的入門工具。彈簧啟動啟動器-雄貓的替代品

要了解如何交換技術方面,請參閱交換 Web 伺服器和日志記錄系統的操作文檔。

三、配置類

Spring Boot 傾向于基于 Java 的配置。 盡管SpringApplication 可以與 XML 源一起使用,但我們通常建議将主源設定為單個類@Configuration。 通常,用@Configuration定義一個有main方法的類。

3.1. 導入其他配置類

當你不需要把所有的東西都放在一個Class裡時。 @Import注釋可用于導入其他配置類。或者,您可以使用@ComponentScan 自動加載所有 Spring 元件,包括類。

@Import({ 類名.class , 類名.class... })
public class Appcalss {

}           

3.2自動配置

Spring Boot的自動裝配機制會試圖根據你所添加的依賴來自動配置你的Spring應用程式。 例如,如果你添加了 HSQLDB 依賴,而且你沒有手動配置任何DataSource Bean,那麼Spring Boot就會自動配置記憶體資料庫。

你需要将 @EnableAutoConfiguration 或 @SpringBootApplication 注解添加到你的 @Configuration 類中,進而開啟自動配置功能。

@EnableAutoConfiguration:啟用Spring Boot的自動配置機制,類似在java代碼中自動import,屬于自動導入

@SpringBootConfiguration(proxyBeanMethods = false)
@EnableAutoConfiguration
@Import({ SomeConfiguration.class, AnotherConfiguration.class })
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

}           

禁用特定的自動配置類

如果發現正在應用不需要的特定自動配置類,則可以使用 的 exclude 屬性來禁用它們,如以下示例所示:@SpringBootApplication

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class MyApplication {

}           

四、Spring Bean 和 依賴注入

你可以使用任何标準的Spring技術來定義你的Bean以及依賴注入關系。 推薦使用構造函數注入,并使用 @ComponentScan 注解來掃描Bean。

如果你按照上面的建議構造你的代碼(将你的啟動類定位在頂級包中),你可以在啟動類添加 @ComponentScan 注解,也不需要定義它任何參數, 你的所有應用元件(@Component、@Service、@Repository、@Controller 和其他)都會自動注冊為Spring Bean。

也可以直接使用 @SpringBootApplication 注解(該注解已經包含了 @ComponentScan)。

下面的例子展示了一個 @Service Bean,它使用構造器注入的方式注入了 RiskAssessor Bean。

五、使用@SpringBootApplication注釋

許多 Spring Boot 開發人員喜歡他們的應用程式使用自動配置、元件掃描并能夠在他們的“應用程式類”上定義額外的配置。 單個注釋可用于啟用這三個功能,即:@SpringBootApplication

  • @EnableAutoConfiguration:啟用 Spring 啟動的自動配置機制
  • @ComponentScan:在應用程式所在的包上啟用掃描(請參閱最佳實踐)@Component)
  • @SpringBootConfiguration:在上下文中啟用額外 Bean 的注冊或導入其他配置類。 Spring 标準的替代方案,可幫助在內建測試中進行配置檢測。
  • // Same as @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
    @SpringBootApplication
    public class MyApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(MyApplication.class, args);
        }
    
    }           

    六、開發一個 SpringBoot應用程式

    在開始之前,請打開終端并運作以下指令以確定已安裝有效版本的 Java 和 Maven:

    $ java -version
    openjdk version "17.0.4.1" 2022-08-12 LTS
    OpenJDK Runtime Environment (build 17.0.4.1+1-LTS)
    OpenJDK 64-Bit Server VM (build 17.0.4.1+1-LTS, mixed mode, sharing)           
    mvn -v
    Apache Maven 3.8.5 (3599d3414f046de2324203b78ddcf9b5e4388aa0)
    Maven home: usr/Users/developer/tools/maven/3.8.5
    Java version: 17.0.4.1, vendor: BellSoft, runtime: /Users/developer/sdkman/candidates/java/17.0.4.1-librca           

    1、建立 POM

    我們需要從建立一個 Maven 檔案開始。

    <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.example</groupId>
        <artifactId>myproject</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>3.0.2</version>
        </parent>
    
        <!-- Additional lines to be added here... -->
    
    </project>           

    2、添加類路徑依賴

    在此之前,我們可以通過運作以下指令來檢視我們目前擁有的内容:spring-boot-starter-web

    $ mvn dependency:tree
    
    [INFO] com.example:myproject:jar:0.0.1-SNAPSHOT           

    由于我們正在開發一個 Web 應用程式,是以我們添加一個依賴項

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>           

    3、編寫代碼

    為了完成我們的應用程式,我們需要建立一個 Java 檔案。 預設情況下,Maven 從 編譯源代碼,是以您需要建立該目錄結構,然後添加一個名為以包含以下代碼的檔案:src/main/javasrc/main/java/MyApplication.java

    @RestController
    @SpringBootApplication
    public class MyApplication {
    
        @RequestMapping("/")
        String home() {
            return "Hello World!";
        }
    
        public static void main(String[] args) {
            SpringApplication.run(MyApplication.class, args);
        }
    
    }           

    @RestController:相當于@ResponseBody + @Controller,@Controller注解表示後,該類将會被spring管理,@ResponseBody注解辨別後,響應資料可以是文本或者JSON資料類型

    @RequestMapping:是一個用來處理請求位址映射的注解,可用于映射一個請求或一個方法,可以用在類或方法上。

    七、Tracing

    Spring Boot 提供依賴管理和自動配置Micrometer Tracing,這是常用資訊監控庫 。

    Spring Boot 為以下跟蹤器提供自動配置:

  • 使用Zipkin或Wavefront的OpenTelemetry
  • OpenZipkin Brave with Zipkin or Wavefront
  • 我們需要一個可用于開始跟蹤的示例應用程式。 就我們的目的而言,“入門.html部分中介紹的簡單”Hello World!“Web 應用程式就足夠了。 我們将使用OpenTelemetry跟蹤器與Zipkin作為跟蹤後端。

    回顧一下,我們的主要應用程式代碼如下所示:

    @RestController
    @SpringBootApplication
    public class MyApplication{
        privatestaticfinal Log logger = LogFactory.getLog(MyApplication.class);
        @RequestMapping("/")
          String home(){
            logger.info("home() has been called");
            return"Hello World!";
        }
    
        public static void main(String[] args){
            SpringApplication.run(MyApplication.class, args);
        }
    
    }           
    該方法中添加了一個記錄器語句,稍後會很重要。home()

    現在我們必須添加以下依賴項:

  • org.springframework.boot:spring-boot-starter-actuator
  • io.micrometer:micrometer-tracing-bridge-otel- 這是将千分尺觀測 API 橋接到開放遙測所必需的。
  • io.opentelemetry:opentelemetry-exporter-zipkin- 需要向 Zipkin 報告痕迹。
  • 添加以下應用程式屬性:

    management.tracing.sampling.probability=1.0           

    預設情況下,Spring Boot 僅對 10% 的請求進行采樣,以防止跟蹤後端不堪重負。 此屬性将其切換為 100%,以便将每個請求發送到跟蹤後端。

    為了收集和可視化跟蹤,我們需要一個正在運作的跟蹤後端。 我們在這裡使用 Zipkin 作為我們的跟蹤後端。 Zipkin 快速入門指南提供了如何在本地啟動 Zipkin 的說明。

    Zipkin 運作後,您可以啟動應用程式。

    八、日志記錄

    Spring Boot 沒有強制性的日志記錄依賴項,除了通常由 Spring Framework 子產品提供的 Commons Logging API。 要使用 Logback,您需要将其包含在類路徑中。 推薦的方法是通過啟動器,這完全取決于 . 對于 Web 應用程式,您隻需要 ,因為它以傳遞方式依賴于日志記錄啟動器。 如果使用 Maven,則以下依賴項會為您添加日志記錄:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>           

    Spring Boot 有一個抽象,它試圖根據類路徑的内容配置日志記錄。 如果 Logback 可用,則它是首選。LoggingSystem

    如果需要對日志記錄進行的唯一更改是設定各種記錄器的級别,則可以使用“logging.level”字首執行此操作,如以下示例所示:application.properties

    logging.level.org.springframework.web=debug
    logging.level.org.hibernate=error           

    除了控制台之外,您還可以使用 設定要将日志寫入的檔案的位置。要配置日志記錄系統的更細粒度設定,您需要使用相關支援的本機配置格式。 預設情況下,Spring 引導從系統的預設位置(例如 Logback)選取本機配置,但您可以使用該屬性設定配置檔案的位置。

    1、為日志記錄配置回日志

    如果需要将自定義應用于 logback,而不是可以使用 實作的自定義項,則需要添加标準 logback 配置檔案。 您可以将檔案添加到類路徑的根目錄中,以便進行回查

    Spring 引導提供了許多登入配置,這些配置可以在您自己的配置中。 這些包括旨在允許重新應用某些常見的 Spring 引導約定。included

    以下檔案在 下提供:org/springframework/boot/logging/logback/

    • defaults.xml- 提供轉換規則、模式屬性和常用記錄器配置。
    • console-appender.xml- 使用 .ConsoleAppenderCONSOLE_LOG_PATTERN
    • file-appender.xml- 使用适當的設定添加 和。RollingFileAppenderFILE_LOG_PATTERNROLLING_FILE_NAME_PATTERN

    此外,還提供了舊檔案以與早期版本的 Spring Boot 相容。base.xml

    典型的自定義檔案如下所示:logback.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
        <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
        </root>
        <logger name="org.springframework.web" level="DEBUG"/>
    </configuration>           

    您的登入配置檔案還可以利用負責為您建立的系統屬性:

    • ${PID}:目前程序 ID。
    • ${LOG_FILE}:是否在引導的外部配置中設定。logging.file.name
    • ${LOG_PATH}:是否在 Boot 的外部配置中設定了(表示日志檔案所在的目錄)。logging.file.path
    • ${LOG_EXCEPTION_CONVERSION_WORD}:是否在引導的外部配置中設定。logging.exception-conversion-word
    • ${ROLLING_FILE_NAME_PATTERN}:是否在引導的外部配置中設定。logging.pattern.rolling-file-name

    Spring Boot 還通過使用自定義 Logback 轉換器在控制台上(但不在日志檔案中)提供了一些不錯的 ANSI 顔色終端輸出

    2、配置 log4j 用于日志記錄

    Spring Boot 支援 Log4j 2 進行日志記錄配置,如果它位于類路徑上。 如果使用啟動器來組裝依賴項,則必須排除 Logback,然後改為包含 Log4j 2。 如果您不使用啟動器,除了 Log4j 2 之外,您還需要(至少)提供。

    推薦的路徑是通過啟動器,即使它需要一些搖晃。 以下示例顯示了如何在 Maven 中設定啟動器:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>           

    九、配置 SSL

    可以通過設定各種屬性(通常在 或 中)以聲明方式配置 SSL。 以下示例顯示如何使用 Java 密鑰庫檔案設定 SSL 屬性:server.ssl.*

    server.port=8443
    server.ssl.key-store=classpath:keystore.jks
    server.ssl.key-store-password=secret
    server.ssl.key-password=another-secret           

    十、Lazy Initialization

    SpringApplication允許應用程式被懶初始化。 當啟用懶初始化時,Bean在需要時被建立,而不是在應用程式啟動時。 是以,懶初始化可以減少應用程式的啟動時間。 在一個Web應用程式中,啟用懶初始化後将導緻許多與Web相關的Bean在收到HTTP請求之後才會進行初始化。

    懶初始化的一個缺點是它會延遲發現應用程式的問題。 如果一個配置錯誤的Bean被懶初始化了,那麼在啟動過程中就不會再出現故障,問題隻有在Bean被初始化時才會顯現出來。 還必須注意確定JVM有足夠的記憶體來容納應用程式的所有Bean,而不僅僅是那些在啟動期間被初始化的Bean。 由于這些原因,預設情況下不啟用懶初始化,建議在啟用懶初始化之前,對JVM的堆大小進行微調。

    spring.main.lazy-initialization=true           
    如果你想禁用某些Bean的懶初始化,同時對應用程式的其他部分使用懶初始化,你可以使用 注解将其'Lazy' 屬性顯式地設定為 false。@Lazy(false)

    十一、優雅停機

    所有四個嵌入式Web伺服器(Jetty、Reactor Netty、Tomcat和Undertow)以及基于響應式和Servlet的Web應用都支援優雅關閉。 它作為關閉應用程式上下文的一部分發生,并在停止 SmartLifecycle bean的最早階段執行。 這種停止處理使用一個逾時,提供一個寬限期,在此期間,現有的請求将被允許完成,但不允許有新的請求。 不允許新請求的确切方式取決于正在使用的網絡伺服器。 Jetty、Reactor Netty和Tomcat将在網絡層停止接受請求。 Undertow将接受請求,但立即響應服務不可用(503)的回應。

    server:
      shutdown: "graceful"           

    文章下方有交流學習區!一起學習進步!也可以前往官網,加入官方微信交流群你的支援和鼓勵是我創作的動力❗❗❗

    Doker的成長,歡迎大家一起陪伴!!!

    我發好文,兄弟們有空請把我的官方旗艦店流量撐起來!!!

    官網:Doker 多克; 官方旗艦店:首頁-Doker 多克 多克創新科技企業店-淘寶網 全品優惠