Spring-注解@Import

关于@Import

@Import注解的作用和Spring XML配置中的<import/>标签相同,用来向IOC容器中注入实例,Spring 4.2 之前的版本只支持注入三种类的实例:@Configuration类、ImportSelector的实现类和 ImportBeanDefinitionRegistrar的实现类,Sring 4.2后也可以将普通的Java类注入IOC容器。

用法示例

下面演示一下 @Import注解的用法。@Import的三种用法主要包括:

  1. 通过class数组直接导入
  2. ImportSelector实现类【重点关注】
  3. 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 {

/**
* 通过指定全类名导入一个或多个实例至IOC容器
*/
@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
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {


@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//指定bean定义信息(包括bean的类型、作用域...)
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(TestBean3.class);
//注册一个bean指定bean名字(id)
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
------ 本文完 ------