Spring Boot 自動裝配流程
阿新 • • 發佈:2020-03-11
# Spring Boot 自動裝配流程
本文以 mybatis-spring-boot-starter 為例簡單分析 Spring Boot 的自動裝配流程。
## Spring Boot 發現自動配置類
這裡說的自動配置類指的是在 `META-INF/spring.factories` 檔案中宣告的 `XXXAutoConfiguration` 類。
首先,我們從 `@SpringBootApplication` 註解的定義中,我們可以發現有一個叫做 `@EnableAutoConfiguration` 的註解,這也是 SpringBoot 實現自動裝配最關鍵的註解。
```java
//@EnableAutoConfiguration 註解的定義
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class[] exclude() default {};
String[] excludeName() default {};
}
```
`@Target` `@Retention` `@Documented` `@Inherited` 都是 jdk 提供的註解,有興趣可以去查檢視,這裡就不做分析了。這裡主要分析 `@AutoConfigurationPackage` 和 `@Import({AutoConfigurationImportSelector.class})` 究竟起到什麼作用。
```java
//@AutoConfigurationPackage 註解的定義
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
}
```
在 `@AutoConfigurationPackage` 註解的定義中,我們又發現一個 `@Import` 註解。`@Import` 註解是由 Spring 提供的,作用是將某個類例項化並加入到 Spring IoC 容器中。所以我們要想知道 `@Import({Registrar.class})` 究竟做了什麼就需要了解 `Registrar` 這個類裡包含了哪些方法。
```java
//Registrar 類的定義
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
Registrar() {
}
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName());
}
pu