关于@Import
@Import注解的作用和Spring XML配置中的<import/>标签相同,用来向IOC容器中注入实例,Spring 4.2 之前的版本只支持注入三种类的实例:@Configuration类、ImportSelector的实现类和 ImportBeanDefinitionRegistrar的实现类,Sring 4.2后也可以将普通的Java类注入IOC容器。
用法示例
下面演示一下 @Import注解的用法。@Import的三种用法主要包括:
- 通过class数组直接导入
- ImportSelector实现类【重点关注】
- ImportBeanDefinitionRegistrar实现类
定义普通Java类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| public class TestBean1 { @Override public String toString() { return super.toString()+"--我是TestBean1"; } } public class TestBean2 { @Override public String toString() { return super.toString()+"--我是TestBean2"; } } public class TestBean3 { @Override public String toString() { return super.toString()+"--我是TestBean3"; } } public class TestBean4 { @Override public String toString() { return super.toString()+"--我是TestBean4"; } }
|
通过class数组直接导入
1 2 3 4 5 6 7
| @Configuration @Import({TestBean1.class}) public class ApplicationConfiguration {
}
|
ImportSelector实现类
创建一个 MyImportSelector类并实现 ImportSelector接口,并实现 selectImports()方法,在这个方法中通过数组的方式,指定要导入哪些类的实例至IOC容器。
1 2 3 4 5 6 7 8 9 10 11
| public class MyImportSelector implements ImportSelector {
@Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{"com.lzumetal.springboot.annotation.bean.TestBean2"}; }
}
|
在 @Import注解中,导入MyImportSelector类。
1 2 3 4 5 6 7
| @Configuration @Import({TestBean1.class, MyImportSelector.class}) public class ApplicationConfiguration {
}
|
ImportBeanDefinitionRegistrar实现类
编写一个ImportBeanDefinitionRegistrar实现类:
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(TestBean3.class); registry.registerBeanDefinition("testBean3333",rootBeanDefinition); }
}
|
并将这个实现类通过 @Import注解导入。
1 2 3 4 5 6 7 8
| @Configuration @Import({TestBean1.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class}) public class ApplicationConfiguration {
}
|
单元测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| @RunWith(SpringRunner.class) @SpringBootTest(classes = AnnotationBootstrap.class) @Slf4j public class ImportTest {
@Autowired(required = false) private TestBean1 testBean1;
@Autowired(required = false) private TestBean2 testBean2;
@Autowired(required = false) private TestBean3 testBean3;
@Autowired(required = false) private TestBean4 testBean4;
@Test public void Import() { log.info("testBean1={}", testBean1); log.info("testBean2={}", testBean2); log.info("testBean3={}", testBean3); log.info("testBean4={}", testBean4); }
}
|
输出结果:
1 2 3 4
| testBean1=com.lzumetal.springboot.annotation.bean.TestBean1@150ebdd--我是TestBean1 testBean2=com.lzumetal.springboot.annotation.bean.TestBean2@1a33e2c--我是TestBean2 testBean3=com.lzumetal.springboot.annotation.bean.TestBean3@1193686--我是TestBean3 testBean4=null
|