目录
@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);}
}