啟動時

了解 @SpringBootApplication 做了哪些事

@SpringBootApplication
public class DemoJApplication {

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

其中包含

  • @EnableAutoConfiguration - 自動配置

  • @SpringBootConfiguration

    • @Configuration - 配置 Springboot

  • @ComponentScan - 掃描元件

🌟自動配置🌟

  • 透過 @EnableAutoConfiguration 配置,裝配所有會用的 Bean, 並創建一個 Spring 的 ApplicationContext 實例。

讓 Spring Boot 根據 classpath 中的jar包依賴進行自動配置。

主要透過 @Import(AutoConfigurationImportSelector.class)使其能夠完成自動配置的功效。

AutoConfigurationImportSelector 使用 SpringFramework 的 SpringFactoriesLoader 支持。

Spring SPI

可以將所有 @Configuration 並符合的配置,將其加載到 springboot 創建並使用的 IOC 容器。

Spring Boot 將自動掃描 @SpringBootApplication 所在類別的同層 package 以及下層 package 裡的Bean,所以入口類建議就配置在 grounpID + arctifactID 組合的包名下。

查看所有已配置的 Bean

@SpringBootApplication
public class DemoJApplication {

	public static void main(String[] args) {
		//取出 ApplicationContext
		ApplicationContext ctx = 
					SpringApplication.run(DemoJApplication.class, args);
		
		//透過其方法 getBeanDefinitionNames
		String[] beanNames = ctx.getBeanDefinitionNames();
		
		//列出所有取得的 Bean名稱
		Arrays.sort(beanNames);
		for (String beanName : beanNames) {
			System.out.println(beanName);
    }
	}
}

查看在什麼地方註冊

透過 JVM 加入 -Ddebug=true 作為參數傳遞即可

Condition 註解引入Bean

搭配 Maven 引入的 jar 包,自行配置。

在官方 springboot 中,只要已經在 org.springframework.boot.autoconfigure 就會自動配置,若不含在裡面,就必須自行建立 bean 使其能夠被偵測到。

Condition 註解

🍀 配置 Springboot

  • 透過 @SpringBootConfiguration 配置

標註此類別為 Springboot 的 @Configuration為了明確表達意圖,其功能同理。

唯一差別在於 @SpringBootConfiguration 能為其自動定位,在單元或集成測試特別有用

同樣也可以在此類別加入 @Bean,也會被偵測到,因為有 @Configuration

🍀 掃描元件

  • 透過 @ComponentScan 配置

掃描所有的標註 @Component 的元件。

若未定義指定位置,會掃描其底下的所有 package 。

引入的 Maven 如何 AutoConfig

Parent

以 Spring-MVC Maven 為例:

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

透過搭配 @Conditional 註解,依據配置,在滿足其條件之後才會加載進 context 。

Condition 註解

參考資料

Last updated

Was this helpful?