1. 程式人生 > 其它 >Java面試——Spring Boot

Java面試——Spring Boot

技術標籤:面試

Java面試——Spring Boot

一、談談你對 SpringBoot 的理解


簡單說說我的理解:Java是一個靜態語言,相比動態語言,它相對笨重,體現在我們搭建 SSM 框架寫一個 Helloword 的時候相當複雜,需要寫一大堆的配置。還有在匯入 jar包依賴的時候版本號問題,令人頭疼。但是,我們有 Spring呀,真的是 Java 開發人員的福音。SpringBoot 就是為解決這些問題而生的。讓我們寫一個 Helloword 跟動態語言一樣簡單。版本控制也通過 SpringBoot 與 Maven的外掛進行整合管理,讓我們將重點放在業務的開發之上。下面就說說其優點:

【1】建立獨立的 Spring 應用,可以通過 java -jar xx.jar 直接執行;
【2】直接嵌入 Tomcat、Jetty或Undertow 等 Web 容器(不需要部署 war 檔案),後期與雲端計算平臺整合方便(docket);
【3】提供固化的 “starter” 的 pom 配置簡化構建 maven 配置,避免大量的 Maven匯入和各種版本衝突;
【4】當條件滿足時自動裝配 Spring 或第三方類庫;
【5】提供運維特性,基於 ssh、http、telnet 對伺服器進行監控、健康檢查以及外部化配置;
【6】SpringBoot 不需要 XML 配置,也不是通過程式碼生成來實現,而是通過條件註解+類實現配置檔案;
【7】基於環境的配置使用這些屬性,您可以將您正在使用的環境傳遞到應用程式:-Dspring.profiles.active = {enviornment}。在載入主應用程式屬性檔案後,Spring 將在(application{environment}.properties)中載入後續的應用程式屬性檔案。

二、Spring 和 SpringBoot 有什麼不同


【1】**Maven 依賴:**Spring Boot 對依賴進行了進一步封裝(starter),我們只需要根據場景依賴 starter 即可。在進行構建期間,所有其他依賴項將自動新增到專案中。

 1 <!--首先,讓我們看一下使用Spring建立Web應用程式所需的最小依賴項-->
 2 <dependency>
 3     <groupId>org.springframework</groupId>
 4     <artifactId>spring-web</artifactId>
 5     <version>5.1.0.RELEASE</version>
 6 </dependency>
 7 <dependency>
 8     <groupId>org.springframework</groupId>
 9     <artifactId>spring-webmvc</artifactId>
10     <version>5.1.0.RELEASE</version>
11 </dependency>
12 
13 <!--與Spring不同,Spring Boot只需要一個依賴項來啟動和執行Web應用程式-->
14 <dependency>
15     <groupId>org.springframework.boot</groupId>
16     <artifactId>spring-boot-starter-web</artifactId>
17     <version>2.0.6.RELEASE</version>
18 </dependency>

【2】Spring Boot 擁有預設的配置資訊,Spring Boot 只需要在 application 配置檔案中配置幾個屬性來完成如下操作:所有Spring 配置都是通過一個名為 auto-configuration 的過程新增 Boot web starter 來自動包含的。這意味著Spring Boot 將檢視應用程式中存在的依賴項,屬性和 Bean,並根據這些依賴項,對屬性和 bean進行配置。當然,如果我們想要新增自己的自定義配置,那麼Spring Boot 自動配置將會退回。

1 spring.mvc.view.prefix=/WEB-INF/jsp/
2 spring.mvc.view.suffix=.jsp

【3】 預設情況下,Spring Boot 使用嵌入式容器來執行應用程式。在這種情況下,Spring Boot 使用 public static void main 入口點來啟動嵌入式 Web伺服器。此外,它還負責將 Servlet,Filter 和 ServletContextInitializerbean 從應用程式上下文繫結到嵌入式 servlet容器。Spring Boot 的另一個特性是它會自動掃描同一個包中的所有類或 Main 類的子包中的元件。Spring Boot 提供了將其部署到外部容器的方式:

1 @SpringBootApplication
2 public class Application {
3     public static void main(String[] args) {
4         SpringApplication.run(Application.class, args);
5     }
6 }

【4】**打包和部署:**這兩個框架都支援Maven 和 Gradle 等通用包管理技術。但是在部署方面,這些框架差異很大。例如,Spring Boot Maven 外掛在 Maven中提供 Spring Boot支援。它還允許打包可執行jar 或 war包。在部署環境中 Spring Boot 對比 Spring的一些優點包括:
■ 提供嵌入式容器支援;
■ 使用命令 java -jar獨立執行 jar;
■ 在外部容器中部署時,可以選擇排除依賴關係以避免潛在的 jar 衝突;
■ 部署時靈活指定配置檔案的選項;
■ 用於整合測試的隨機埠生成;

簡而言之,我們可以說 Spring Boot 只是 Spring本身的擴充套件,使開發,測試和部署更加方便。

三、SpringBoot 與 Spring Cloud 的區別


【1】Spring Cloud 基於Spring Boot,為微服務體系開發中的架構問題,提供了一整套的解決方案——服務註冊與發現,服務消費,服務保護與熔斷,閘道器,分散式呼叫追蹤,分散式配置管理等。
【2】Spring Cloud 是一個基於 SpringBoot 實現的雲應用開發工具;SpringBoot 專注於快速、方便整合的單個個體,Spring Cloud 是關注全域性的服務治理框架;SpringBoot使用了預設大於配置的理念,很多整合方案已經幫你選擇好了,能不配置就不配置,Spring Cloud 很大的一部分是基於 SpringBoot 來實現。

四、SpringBoot 中的 application.properties 或者 application.yml 配置檔案是什麼


application.ymlapplication.properties(預設配置檔案) 檔案這兩種檔案都是 SpringBoot的配置檔案,註釋都可以用#號來註釋,只不過因為application.yml 看起來更直觀,更清晰。但是要注意一點:properties 檔案的優先順序高於 yml檔案,即如果兩個檔案中都配置了埠號,只有 properties中的埠號有效,而 yml檔案中埠配置無效。
【1】application.properties 檔案,在 properties檔案中是以 ”.”進行分割的;

server.port=8085
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
spring.datasource.url=jdbc:mysql://aliyuncs.com:3306/home?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true
spring.datasource.username=root
spring.datasource.password=***
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

【2】application.properties 檔案,都是 K-V格式,並且通過 ” : ” 引號進行賦值;需要注意冒號後面有個空格;

server:
  port: 8081
 
spring:
    datasource:
        name: test
        url: jdbc:mysql://localhost:3306/springbootdatabase
        username: root
        password: 123456
        # 使用druid資料來源
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        filters: stat
        maxActive: 20
        initialSize: 1
        maxWait: 60000
        minIdle: 1
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: select 'x'
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true
        maxOpenPreparedStatements: 20    

五、SpringBoot 的核心配置檔案有哪幾個?它們的區別是什麼?


Spring Boot 中有以下兩種配置檔案:bootstrap (.yml 或者 .properties) 和 application (.yml 或者 .properties):bootstrap 是應用程式的父上下文,也就是說 bootstrap 載入優先於 applicaton。這兩個上下文共用一個環境。它預設也不能被本地相同配置覆蓋。主要給運維人員使用,可以對開發的一些配置進行覆蓋。bootstrap 配置檔案有以下幾個應用場景:使用 Spring Cloud Config 配置中心時,這時需要在 bootstrap 配置檔案中新增連線到配置中心的配置屬性來載入外部配置中心的配置資訊。一些固定的不能被覆蓋的屬性和一些加密/解密的場景。

六、SpringBoot 的配置檔案有哪幾種格式?它們有什麼區別?


.properties.yml,它們的區別主要是書寫格式不同。

【1】**.properties:**通過.進行分割。

app.user.name = javastack

【2】**.yml:**賦值的時候,冒號後面有個空格。不支援 @PropertySource 註解匯入配置。可以通過如下註解:@ConfigurationProperties(prefix=“xxx”) String 型別的一定需要 setter 來接收屬性值;maps、collections和 arrays不需要。

app:
  user:
    name: javastack

七、SpringBoot 的核心註解是哪個?它主要由哪幾個註解組成的?


啟動類上面的註解是 @SpringBootApplication,它也是 Spring Boot 的核心註解,主要組合包含了以下 3 個註解:
【1】**@SpringBootConfiguration:組合了 @Configuration 註解,實現配置檔案的功能。
【2】
@EnableAutoConfiguration****:開啟自動配置的功能,也可以關閉某個自動配置的選項,如關閉資料來源自動配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
【3】
@ComponentScan:**Spring元件掃描。
原始碼部落格連線】:連結

八、SpringBoot 自動配置及原理


【1】SpringBoot 啟動的時候載入主配置類,@SpringBootApplication下開啟了主配置功能 @EnableAutoConfiguration
【2】**@EnableAutoConfiguration 作用:**①、利用 EnableAutoConfigurationImportSelector 給容器匯入一些元件。
②、可以檢視 selectImports() 方法的內容:List configurations = getCandidateConfigurations(annotationMetadata, attributes);獲取候選的配置。SpringFactoriesLoader.loadFactoryNames() 掃描所有 jar包類路徑下 META‐INF/spring.factories 把掃描到的這些檔案的內容包裝成 properties物件從 properties中獲取到 EnableAutoConfiguration.class 類(類名)對應的值,然後把他們新增在容器中。
【3】將類路徑下 META-INF/spring.factories 裡面配置的所有 EnableAutoConfiguration 的值加入到了容器中;

# EnableAutoConfiguration  對應 @EnableAutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\

每一個這樣的 xxxAutoConfiguration 類都是容器中的一個元件,都加入到容器中。用他們來做自動配置;
【4】每一個自動配置類進行自動配置,以 HttpEncodingAutoConfiguration(Http編碼自動配置)為例解釋自動配置原理;

@Configuration //表示這是一個配置類,以前編寫的配置檔案一樣,也可以給容器中新增元件
@EnableConfigurationProperties(HttpEncodingProperties.class) //啟動指定類的
//ConfigurationProperties功能;將配置檔案中對應的值和HttpEncodingProperties繫結起來;並把
//HttpEncodingProperties加入到ioc容器中
@ConditionalOnWebApplication //Spring底層@Conditional註解(Spring註解版),根據不同的條件,如果
//滿足指定的條件,整個配置類裡面的配置就會生效; 判斷當前應用是否是web應用,如果是,當前配置類生效
@ConditionalOnClass(CharacterEncodingFilter.class) //判斷當前專案有沒有這個類
//CharacterEncodingFilter;SpringMVC 中進行亂碼解決的過濾器;
//判斷配置檔案中是否存在某個配置 spring.http.encoding.enabled;如果不存在,判斷也是成立的
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true) 
//即使我們配置檔案中不配置pring.http.encoding.enabled=true,也是預設生效的;
public class HttpEncodingAutoConfiguration {
    //他已經和SpringBoot的配置檔案映射了
    private final HttpEncodingProperties properties;
    //只有一個有參構造器的情況下,引數的值就會從容器中拿
    public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
        this.properties = properties;
    }

    @Bean //給容器中新增一個元件,這個元件的某些值需要從properties中獲取
    @ConditionalOnMissingBean(CharacterEncodingFilter.class) //判斷容器沒有這個元件?
    public CharacterEncodingFilter characterEncodingFilter() {
        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
        filter.setEncoding(this.properties.getCharset().name());
        filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
        filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
        return filter;
    }

根據當前不同的條件判斷,決定這個配置類是否生效?一但這個配置類生效;這個配置類就會給容器中新增各種元件;這些元件的屬性是從對應的 properties類中獲取的,這些類裡面的每一個屬性又是和配置檔案繫結的;
【5】所有在配置檔案中能配置的屬性都是在 xxxxProperties 類中封裝;配置檔案能配置什麼就可以參照某個功能對應的屬性類

@ConfigurationProperties(prefix = "spring.http.encoding") //從配置檔案中獲取指定的值和bean的屬性進行繫結
public class HttpEncodingProperties {
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF‐8");

精髓:【1】SpringBoot 啟動會載入大量的自動配置類;
【2】看我們需要的功能有沒有SpringBoot 預設寫好的自動配置類;
【3】我們再來看這個自動配置類中到底配置了哪些元件;(只要我們要用的元件有,我們就不需要再來配置了)
【4】給容器中自動配置類新增元件的時候,會從 properties類中獲取某些屬性。我們就可以在配置檔案中指定這些屬性的值;
xxxxAutoConfigurartion:自動配置類,給容器中新增元件。xxxxProperties:封裝配置檔案中相關屬性;
更多配置資訊連線】:連結

九、如何理解 SpringBoot 中的 Starters


Starters 可以理解為啟動器,它包含了一系列可以整合到應用裡面的依賴包,你可以一站式整合 Spring及其他技術,而不需要到處找示例程式碼和依賴包。如你想使用 Spring JPA訪問資料庫,只要加入 spring-boot-starter-data-jpa 啟動器依賴就能使用了。Starters 包含了許多專案中需要用到的依賴,它們能快速持續的執行,都是一系列得到支援的管理傳遞性依賴。

【1】**starters 命名:*Spring Boot 官方的啟動器都是以 spring-boot-starter- 命名的,代表了一個特定的應用型別。第三方的啟動器不能以 spring-boot開頭命名,它們都被 Spring Boot官方保留。一般第三方應該這樣命名,像 mybatis 的 mybatis-spring-boot-starter。
【2】**starters 分類:**① Spring Boot 應用類啟動器;② Spring Boot 生產啟動器;③ Spring Boot 技術類啟動器;④ 其他第三方啟動器;

十、SpringBoot 有哪幾種讀取配置的方式


在 application.yml 或者 application.properties 檔案中新增:

info.address=CN
info.company=SpringBoot
info.degree=high 

【1】@Value 註解讀取方式:

@Component
public class InfoConfig1 {

    @Value("${info.address}")
    private String address;
}

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-XtdFCYs0-1612619470163)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

【2】@ConfigurationProperties 註解讀取方式:

@Component
@ConfigurationProperties(prefix = "info")
public class InfoConfig2 {

    private String address;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

【3】 @[email protected]註解:讀取指定檔案

@Component
@PropertySource(value = { "config/db-config.properties" })
public class DBConfig1 {

    @Value("${db.username}")
    private String username;
}

注意:@PropertySource不支援 yml檔案讀取。

【4】 @[email protected]註解讀取方式:

@Component
@ConfigurationProperties(prefix = "db")
@PropertySource(value = { "config/db-config.properties" })
public class DBConfig2 {

    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

【5】 Environment 讀取方式:

@Component
public class ReadByEnv {

    @Autowired
    private Environment environment;

    public String getServerPort() {
        return environment.getProperty("server.port");
    }

}

十一、Spring Boot 支援哪些日誌框架?推薦和預設的日誌框架是哪個?


Spring Boot 支援 Java Util Logging、Log4j2、Lockback 作為日誌框架,如果你使用 starters啟動器,Spring Boot 將使用Logback 作為預設日誌框架。無論使用哪種日誌框架,Spring Boot 都支援配置將日誌輸出到控制檯或者檔案中。spring-boot-starter 啟動器包含 spring-boot-starter-logging 啟動器並集成了slf4j 日誌抽象及 Logback日誌框架。

日誌原始碼部落格連線】:連結

十二、SpringBoot 實現熱部署有哪幾種方式


在 Spring Boot 實現程式碼熱部署是一件很簡單的事情,程式碼的修改可以自動部署並重新熱啟動專案。
【1】**引用 devtools 依賴:**當修改 java類時就會熱更新。

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-devtools</artifactId>
	<optional>true</optional>
</dependency>

【2】然後依次點選 File-Settings-Build、Execution、Deployment-Complier,在右邊介面找到圖: 並打勾;下一步按住這幾個鍵 Ctrl+Shift+Alt+/,選中 Registry ,在彈出的提示框中找到 compiler.automake.allow.when.app.running 如下圖並打鉤,就可以順利使用了。
img

【3】devtools 會在 windows資源管理器佔用 java程序,在開發工具裡面殺不掉,只能手動 kill掉,不然重啟會選成埠重複繫結報錯。

**注意事項:**1、生產環境 devtools將被禁用,如 java -jar方式或者自定義的類載入器等都會識別為生產環境。
2、打包應用預設不會包含 devtools,除非你禁用 SpringBoot Maven 外掛的 excludeDevtools 屬性。
3、Thymeleaf 無需配置 spring.thymeleaf.cache:false,devtools 預設會自動設定,參考完整屬性。

十三、如何理解 Spring Boot 配置載入順序


Spring Boot 會涉及到各種各樣的配置,如開發、測試、生產就至少 3 套配置資訊了。Spring Boot 可以輕鬆的幫助我們使用相同的程式碼就能使開發、測試、生產環境使用不同的配置。在 Spring Boot 裡面,可以使用以下幾種方式來載入配置:
【1】properties檔案;
【2】YML檔案;
【3】系統環境變數;
【4】命令列引數等等;

配置屬性載入的順序如下】:數字小的優先順序越高,即數字小的會覆蓋數字大的引數值,我們來實踐下,驗證以上配置引數的載入順序。

 1、開發者工具 `Devtools` 全域性配置引數; 
 2、單元測試上的 `@TestPropertySource` 註解指定的引數; 
 3、單元測試上的 `@SpringBootTest` 註解指定的引數; 
 4、命令列指定的引數,如 `java -jar springboot.jar --name="Java技術棧"`; 
 5、命令列中的 `SPRING_APPLICATION_JSONJSON` 指定引數, 如 `java Dspring.application.json='{"name":"Java技術棧"}' -jar springboot.jar` 
 6、`ServletConfig` 初始化引數; 
 7、`ServletContext` 初始化引數; 
 8、JNDI引數(如 `java:comp/env/spring.application.json`); 
 9、Java系統引數(來源:`System.getProperties()`); 
10、作業系統環境變數引數; 
11、`RandomValuePropertySource` 隨機數,僅匹配:`ramdom.*`; 
12、JAR包外面的配置檔案引數(`application-{profile}.properties(YAML)`) 
13、JAR包裡面的配置檔案引數(`application-{profile}.properties(YAML)`) 
14、JAR包外面的配置檔案引數(`application.properties(YAML)`) 
15、JAR包裡面的配置檔案引數(`application.properties(YAML)`) 
16、`@Configuration`配置檔案上 `@PropertySource` 註解載入的引數; 
17、預設引數(通過 `SpringApplication.setDefaultProperties` 指定);

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-Ytuisu3y-1612619470177)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

十四、Spring Boot 如何定義多套不同環境配置


首先我們要了解一個名詞:Profile。簡單來說,Profile 就是 Spring Boot 可以對不同環境或者指令來讀取不同的配置檔案。假如有開發、測試、生產三個不同的環境,需要定義三個不同環境下的配置。

【1**】基於 properties檔案型別:**你可以另外建立3個環境下的配置檔案:然後在 applcation.properties 檔案中指定當前的環境 spring.profiles.active=test,這時候讀取的就是 application-test.properties檔案。

applcation.properties
application-dev.properties
application-test.properties
application-prod.properties

【2】**基於 yml檔案型別:**只需要一個 applcation.yml 檔案就能搞定,推薦此方式。此時讀取的就是 dev的配置。

spring:
  profiles:
    active: dev

---
#開發環境配置
spring:
  profiles: dev

server:
  port: 1000


---
#測試環境配置
spring:
  profiles: stg

server:
  port: 1001


---
#生產環境配置
spring:
  profiles: prd

server:
  port: 1002

【3】在 cmd 命令中指定:

java -jar xxx.jar --spring.profiles.actvie=dev 

【4】在IDEA 編輯器中指定:在執行按鈕(綠色三角形按鈕)旁邊選擇 Edit Configurations...,在彈出的對話方塊中 Active profiles 輸入 dev 或其他即可。這種方法只有在本地除錯的時候才生效。
優秀部落格連線】:連結

十五、SpringBoot 啟動類的原理


原始碼連線】:連結

十六、SpringBoot 靜態資源配置及原理


原始碼連線】:連結

十七、SpringBoot 國際化配置及原理


原始碼連線】:連結

十八、SpringBoot 模板引擎配置及原理


原始碼連線】:連結

十九、SpringBoot 錯誤頁面配置及原理


原始碼連線】:連結

二十、SpringBoot 攔截器配置及原理


原始碼連線】:連結

二十一、SpringBoot MVC配置及原理


原始碼連線】:連結

二十二、SpringBoot 嵌入式容器配置及原理


原始碼連線】:連結

二十三、如何在 Spring Boot 啟動的時候執行一些特定的程式碼


如果想在 Spring Boot 啟動的時候執行一些特定的程式碼,你可以實現介面 ApplicationRunner 或者 CommandLineRunner,這兩個介面實現方式一樣,它們都只提供了一個run方法。CommandLineRunner:啟動獲取命令列引數:

public interface CommandLineRunner{
    void run(String... args) throws Exception;
}

ApplicationRunner:啟動獲取應用啟動的時候引數:

public interface ApplicationRunner{
    void run(ApplicationArguments args) throws Exception;
}

啟動順序】:如果啟動的時候有多個 ApplicationRunner 和CommandLineRunner,想控制它們的啟動順序,可以實現org.springframework.core.Ordered 介面或者使用 org.springframework.core.annotation.Order 註解。

二十四、自己實現一個 start


CommandLineRunner**:啟動獲取命令列引數:

public interface CommandLineRunner{
    void run(String... args) throws Exception;
}

[外鏈圖片轉存中…(img-XoV0j9Ck-1612619470183)]

ApplicationRunner:啟動獲取應用啟動的時候引數:

public interface ApplicationRunner{
    void run(ApplicationArguments args) throws Exception;
}

啟動順序】:如果啟動的時候有多個 ApplicationRunner 和CommandLineRunner,想控制它們的啟動順序,可以實現org.springframework.core.Ordered 介面或者使用 org.springframework.core.annotation.Order 註解。

二十四、自己實現一個 start


部落格連結】:連結