@Import注解,顾名思义,导入,即把类加入Spring IOC容器。
有多种方式能让类加IOC容器管理,如@Bean、@Component等,@Import是另外一种方式,更加快捷。
1、三种用法
@Import有三种用法:
- .class数组方式;
- ImportSelector方式(Spring Boot底层采用比较得多的方式);
- ImportBeanDefinitionRegistrar方式
第一种方式
.class方式
ImportConfig
@Import({TestA.class, TestB.class})
@Configuration
public class ImportConfig {
}
TestA
public class TestA {
public void printName() {
System.out.println("类名 :" + Thread.currentThread().getStackTrace()[1].getClassName());
}
}
TestB
public class TestB {
public void printName() {
System.out.println("类名 :" + Thread.currentThread().getStackTrace()[1].getClassName());
}
}
TestController
@RestController
public class TestController {
@Autowired
TestA testA;
@Autowired
TestB testB;
@GetMapping("/testA")
public String testA(){
testA.printName();
return "hello testA";
}
@GetMapping("/testB")
public String testB(){
testB.printName();
return "hello testB";
}
}
ImportSelector方式
这种方式要写个类实现ImportSelector接口,重写selectImports()方法,返回的是要导入到容器中的类的全类名数组。
假设有个要加入IOC容器的类TestC
public class TestC {
public void printName() {
System.out.println("类名 :" + Thread.currentThread().getStackTrace()[1].getClassName());
}
}
public class TestImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{
"com.zheng.entity.TestC"
};
}
}
然后用@Import注解导入这个类就行了
@Import({TestImportSelector.class})
@Configuration
public class ImportConfig {
}
再随便写点代码测试一下:
@RestController
public class TestController {
@Autowired
TestC testC;
@GetMapping("/testC")
public String testB(){
testC.printName();
return "hello testC";
}
}
ImportBeanDefinitionRegistrar方式
这种方式和前一种方式类似,也是写个类实现ImportBeanDefinitionRegistrar接口,重写registerBeanDefinitions()方法,不过这种方式可以自定义Bean在容器中的名称。
也是假设有个要加入IOC容器的类TestD……
public class TestC {
public void printName() {
System.out.println("类名 :" + Thread.currentThread().getStackTrace()[1].getClassName());
}
}
然后随便写个什么类实现ImportBeanDefinitionRegistrar接口
public class TestImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(TestD.class);
registry.registerBeanDefinition("testD123",rootBeanDefinition);//自定义注册bean
}
}
再然后就像上面一样用@Import注解导入这个类就行了
@Import({TestImportBeanDefinitionRegistrar.class})
@Configuration
public class ImportConfig {
}
代码测试一下
@RestController
public class TestController {
@Autowired
TestD testD;
@GetMapping("/testD")
public String testB(){
testD.printName();
return "hello testD";
}
}