目錄
@Import注解
源碼分析
使用示例
ImportSelector
源碼分析
使用示例
DeferredImportSelector
源碼分析
使用示例
ImportBeanDefinitionRegistrar
源碼分析
使用示例
@Import注解
源碼分析
- 處理組件類上的@Import注解
- 將@Import引入類對應的BeanDefinition對象添加到Spring容器中
使用示例
- 定義一個普通Java類
package spring.useimport;public class A {
}
- 定義包掃描范圍
package spring.useimport;import org.springframework.context.annotation.ComponentScan;@ComponentScan("spring.useimport")
public class SpringConfig {
}
- 通過@Import注解將組件放入容器中
package spring.useimport;import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;@Import(A.class)
@Component
public class ComponentA {
}
- 測試結果
package spring.useimport;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class AppMain {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);A a = applicationContext.getBean(A.class);System.out.println(a);}
}
ImportSelector
源碼分析
- 執行ImportSelector的selectImports方法回調
使用示例
- 定義一個普通Java類
package spring.useimport;public class B {
}
- 定義包掃描范圍
package spring.useimport;import org.springframework.context.annotation.ComponentScan;@ComponentScan("spring.useimport")
public class SpringConfig {
}
- 通過實現ImportSelector的selectImports方法將組件放入容器中
package spring.useimport;import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;@Import(ImportSelectorForB.class)
@Component
public class ComponentB {
}
package spring.useimport;import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;public class ImportSelectorForB implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{B.class.getName()};}
}
- 測試結果
package spring.useimport;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class AppMain {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);B b = applicationContext.getBean(B.class);System.out.println(b);}
}
DeferredImportSelector
源碼分析
- 處理DeferredImportSelector
使用示例
- 定義一個普通Java類
package spring.useimport;public class C {
}
- 定義包掃描
package spring.useimport;import org.springframework.context.annotation.ComponentScan;@ComponentScan("spring.useimport")
public class SpringConfig {
}
- 通過實現DeferredImportSelector的selectImports方法將組件放入容器中
package spring.useimport;import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;@Import(DeferredImportSelectorForC.class)
@Component
public class ComponentC {
}
package spring.useimport;import org.springframework.context.annotation.DeferredImportSelector;
import org.springframework.core.type.AnnotationMetadata;public class DeferredImportSelectorForC implements DeferredImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{C.class.getName()};}
}
- 測試結果
package spring.useimport;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class AppMain {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);C c = applicationContext.getBean(C.class);System.out.println(c);}
}
ImportBeanDefinitionRegistrar
源碼分析
- 處理ImportBeanDefinitionRegistrar
- 執行ImportBeanDefinitionRegistrar的registerBeanDefinitions方法回調
使用示例
- 定義一個普通Java類
package spring.useimport;public class D {
}
- 定義包掃描規則
package spring.useimport;import org.springframework.context.annotation.ComponentScan;@ComponentScan("spring.useimport")
public class SpringConfig {
}
- 通過ImportBeanDefinitionRegistrar的registerBeanDefinitions方法將組件放入容器中
package spring.useimport;import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;@Import(ImportBeanDefinitionRegistrarForD.class)
@Component
public class ComponentD {
}
package spring.useimport;import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;public class ImportBeanDefinitionRegistrarForD implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {// 將組件的Bean定義對象放入容器中RootBeanDefinition beanDefinition = new RootBeanDefinition(D.class);registry.registerBeanDefinition("d",beanDefinition);}
}
- 測試結果
package spring.useimport;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class AppMain {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);D d = applicationContext.getBean(D.class);System.out.println(d);}
}