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