1. 程式人生 > 其它 >Spring原始碼閱讀 - @Import 一個普通類

Spring原始碼閱讀 - @Import 一個普通類

具體邏輯在 org.springframework.context.annotation.ConfigurationClassParser#processImports 中,下面的 importCandidates 即為 @Import 匯入的類的列表。
最後的一個 else 即為普通類的處理邏輯,實際上就是將其當做一個配置類進行處理。
同時要注意到,在這裡為止,@Import 匯入的類還沒有變為 BD 被注入容器,那麼這個時機在哪

for (SourceClass candidate : importCandidates) {
    // Import 的類繼承了 ImportSelector 介面
    if (candidate.isAssignable(ImportSelector.class)) {
        // ...
    }
    // 繼承了 ImportBeanDefinitionRegistrar 介面,說明這個類有想自己向容器注入 BD 的想法,比如說 MyBatis 自己收集介面, 自己注入這些介面代理類的 BD
    else if (candidate.isAssignable(ImportBeanDefinitionRegistrar.class)) {
        // ........
    }
    else {
        // 普通類,這裡的普通類包括 @Import 直接匯入的沒有繼承上面三個介面的類,還有就是 @Import 匯入了繼承 ImportSelector 介面的類要注入的普通類
        // Candidate class not an ImportSelector or ImportBeanDefinitionRegistrar ->
        // process it as an @Configuration class
        this.importStack.registerImport(
                currentSourceClass.getMetadata(), candidate.getMetadata().getClassName());
        // 把這個"普通類"當做配置類處理
        processConfigurationClass(candidate.asConfigClass(configClass), exclusionFilter);
    }
}