@Import三种类型
@Import三种类型
@Import可导入三种类型的类
- 导入普通的类
- 实现ImportSelector的类
- 实现ImportBeanDefinitionRegistrar的类
@Import代码
ImportSelector
MyImportSelector
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
// importingClassMetadata是@Import注解所在类的元注解信息
System.out.println("MyImportSelector#selectImports() : "+importingClassMetadata.getClassName());
return new String[]{Dog.class.getName(),Cat.class.getName()};
}
}
Config
@Import(MyImportSelector.class)
public class Config {}
Cat
public class Cat {
public void run(){
System.out.println("cat run ..");
}
}
Dog
public class Dog {
public void run(){
System.out.println("dog run ..");
}
}
Main
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext configApplicationContext = new AnnotationConfigApplicationContext();
configApplicationContext.register(Config.class);
configApplicationContext.refresh();
Cat cat = configApplicationContext.getBean(Cat.class);
cat.run();
Dog dog = configApplicationContext.getBean(Dog.class);
dog.run();
}
}
print:
MyImportSelector#selectImports() : importpack.Config
cat run ..
dog run ..
执行时机
此接口关键是返回类类型,只关注返回bd,但是不参与bd的创建过程
应用场景
@EnableXXX
ImportBeanDefinitionRegistrar
MyImportBeanDefinitionRegistrar
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(Dog.class);
registry.registerBeanDefinition("xiaoDog",builder.getBeanDefinition());
}
}
Config
@Import(MyImportBeanDefinitionRegistrar.class)
public class Config { }
Main
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext configApplicationContext = new AnnotationConfigApplicationContext();
configApplicationContext.register(Config.class);
configApplicationContext.refresh();
Dog dog = configApplicationContext.getBean(Dog.class);
dog.run();
}
}
print:
dog run ..
执行时机
此接口关键是传入了注册器,可以直接参与bd的创建过程
应用场景
@MapperScan
总结
- ImportSelector 关注的重点是返回的类,侧重于筛选bd类型
- ImportBeanDefinitionRegistrar 关注注册的过程,相比之下比ImportSelector关注的作用域更多
@Import三种类型
https://www.blaaair.com/archives/import-san-zhong-lei-xing