@Import三种类型

@Import三种类型

@Import可导入三种类型的类

  1. 导入普通的类
  2. 实现ImportSelector的类
  3. 实现ImportBeanDefinitionRegistrar的类

@Import代码

20200408152523285_18367

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 ..

执行时机

20200408155346198_7850

此接口关键是返回类类型,只关注返回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 ..

执行时机

20200408154336437_20487

此接口关键是传入了注册器,可以直接参与bd的创建过程

应用场景

@MapperScan

总结

  1. ImportSelector 关注的重点是返回的类,侧重于筛选bd类型
  2. ImportBeanDefinitionRegistrar 关注注册的过程,相比之下比ImportSelector关注的作用域更多

@Import三种类型
https://www.blaaair.com/archives/import-san-zhong-lei-xing
作者
Glo6f
发布于
2024年02月03日
许可协议