iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0
自我挑戰組

探索 Spring Boot Doc系列 第 5

Doc 6.3.2 Importing XML Configuration & Doc 6.4 Auto-configuration

  • 分享至 

  • xImage
  •  

Doc#6.3.2 Importing XML Configuration
這一小節官方只寫了短短一句話其意,如果你真得必須要使用XML 註冊的話,請先建立一個主要註冊的類別(即標註有 @Configuration) 的註冊類別,在其之上再透過 @ImportResource 載入 XML 檔案進行 Bean 的註冊,另外下方參考資料另有補充附件一和二,裡頭有註冊 bean 用的 Xml 做參考。

Doc#6.4 Auto-configuration
官方原文(一)

Spring Boot auto-configuration attempts to automatically configure your Spring application based on the jar dependencies that you have added. For example, if HSQLDB is on your classpath, and you have not manually configured any database connection beans, then Spring Boot auto-configures an in-memory database.

Spring Boot 自動註冊(auto-configuration) 會嘗試根據你所加入的jar 包配置Spring application。
譬如說,假設 (HSQLDB) 在你的類別路徑(classpath)上面,而且你沒有註冊任何關於資料庫連線的
bean 的話,Spring Boot的自動註冊一個記憶體資料庫(in-memory databases)

官方原文(二)

You need to opt-in to auto-configuration by adding the @EnableAutoConfiguration or @SpringBootApplication annotations to one of your @Configuration classes.

至於如何啟動 auto-configuration ,在主要註冊類別註冊類別 (primary @Configuration class) 上面添加 @SpringBootApplication or @EnableAutoConfiguration 標籤的其中之一即可。

在 上述的官方文件中出現了一個 in-memory database HSQLDB(HyperSQL DataBase),
那什麼是記憶體資料庫,就是他將資料存在你的記憶體上面,與之相對的就是,如果你今天程式關掉或是突然當掉的話,你自然就會遺失掉你的資料,這類資料庫在Spring Boot 是作為崁入式資料庫而存在,那什麼是崁入式資料庫呢 ? 同樣在上述官方的文件就能知其一二,你只需要加入這類資料庫的 jar 包,Spring 就會自動註冊一個記憶體資料庫,使用者不需要去安裝一個資料庫,或是啟一個資料庫的Container,就能使用一個簡易的 關聯式資料庫,而這類只需要加依賴到 classpath,Spring 就會代為啟動的記憶體資料庫就是崁入式資料庫。

這裡回到一個常撰寫 Spring Boot 程式的人,最熟悉的標籤 @SpringBootApplication 。
這個標籤有什麼樣的功能呢 ?

打開任一 IDE 裡頭(筆者的IDE 為 Intellij Ultimate) 的Spring Boot 專案,按下 Command(macOS) 或是 Control (Window) 的同時點擊 @SpringBootApplication 標籤,會打開 SpringBootApplication.java 的原始碼 。

https://ithelp.ithome.com.tw/upload/images/20230920/20161770DtkZBFtAzN.png

我們先把關注的點放在標注在這個 Annotation 類別上面的標籤

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {...}

@Retention 、 @Inherited 在參考資料有詳細說明,這就不贅述。
關注點在於 @SpringBootConfiguration、@EnableAutoConfiguration 、@ComponentScan 三個標籤。

標籤 官方api 簡短說明(完整說明參考資料)
@SpringBootConfiguration Can be used as an alternative to the Spring's standard @Configuration annotation so that configuration can be found automatically (for example in tests).
@EnableAutoConfiguration Enable auto-configuration of the Spring Application Context, attempting to guess and configure beans that you are likely to need.
@ComponentScan Configures component scanning directives for use with @Configuration

@EnableAutoConfiguration: 開起自動掃瞄功能,註冊使用者需要的Spring Bean
@ComponentScan: 掃描所有標有 @ComponentScan 的類別
前兩者就可以將所有 @Component 類別都註冊成 Spring Bean

@SpringBootConfiguration 基本和 @Configuration 基本功能一樣,會被 @ComponentScan 所掃描,所以你可以把 @Bean 的註冊寫在其下面,但基本上在實務我們會在另外定義一個primary configuration class 。在官方api doc 之中,有說明一個Spring application 應該只能(原文: should only ever) 放一個 @SpringBootConfiguration,通常只寫一個 @SpringBootApplication 作替代。

如果 @SpringBootConfiguration 和 @Configuration 以一個差異在於,在測試階段 @SpringBootTest 會在沒有 Nested Configuration class 被使用(@Configuration 類別有一個標有@Configuration的內部靜態類別),以及沒有提供明確類別@SpringBootTest 的情況下去尋找 @SpringBootConfiguration。

參考資料
Xml Configuration :

Xml-based configuration 附件一
https://www.studytonight.com/spring-framework/spring-xml-based-configuration

Xml-based configuration 附件二
https://www.studytonight.com/spring-framework/spring-project-using-sts

java.lang.annotation:

@Retention
https://openhome.cc/Gossip/JavaGossip-V2/AnnotationRetention.htm

@Inherited

https://blog.csdn.net/ab411919134/article/details/81252516

org.springframework.boot
@SpringBootConfiguration
https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/SpringBootConfiguration.html

@EnableAutoConfiguration

https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/EnableAutoConfiguration.html

@ComponentScan

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/ComponentScan.html

Nested Configuration Class
https://www.concretepage.com/spring-5/spring-nested-configuration-classes

SpringBootTest 找不到 SpringBootConfiguration 例外
http://www.masterspringboot.com/testing/how-to-solve-unable-to-find-a-springbootconfiguration-in-your-test/


上一篇
Doc 6.3 Configuration Classes & Doc 6.3.1 Importing Additional Configuration Classes
下一篇
@SpringBootApplication - 別名標籤 @AliasFor
系列文
探索 Spring Boot Doc30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言