1. 程式人生 > >Spring Boot 自動裝配流程

Spring Boot 自動裝配流程

# 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