Spring原始碼閱讀 - @Import 一個普通類
阿新 • • 發佈:2022-04-09
具體邏輯在 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); } }