spring @Import

6. @Import-给容器中快速导入一个组件

通过导入的方式实现把实例加入springIOC容器中

6.1 @Import的三种使用方式

通过查看@Import源码可以发现@Import注解只能注解在类上,以及唯一的参数value上可以配置3种类型的值Configuration,ImportSelector,ImportBeanDefinitionRegistrar,源码如下:

1
2
3
4
5
6
7
8
9
10
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
/**
* {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
* or regular component classes to import.
*/
Class<?>[] value();
}

接下来就分别来看看三种方式具体使用:

6.1.1 基于Configuration也就是直接填对应的class数组

在bean目录下新增两个类Square和Circular如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 定义一个圆形
*
* @author
* @date 2018年5月1日
*/
public class Circular {
}

/**
* 定义一个正方形
*
* @author
* @date 2018年5月1日
*/
public class Square {
}

MainConfig注解配置中增加@Import注解如下:

1
2
3
@Import({Square.class,Circular.class})
@Configuration
public class MainConfig

测试如下

1
2
3
4
5
6
7
8
@Test
public void testImport() {
AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainConfig.class);
String[] beanNames = applicationContext2.getBeanDefinitionNames();
for(int i=0;i<beanNames.length;i++){
System.out.println("bean名称为==="+beanNames[i]);
}
}

6.1.2 基于自定义ImportSelector的使用

定义一个MyImportSelector如下:

1
2
3
4
5
6
7
8
9
10
11
/**
* 定义一个我自己的ImportSelector
*
* @author
* @date 2018年5月1日
*/
public class MyImportSelector implements ImportSelector{
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.zhang.bean.Triangle"};
}
}

MainConfig注解配置修改如下:

1
@Import({Square.class,Circular.class,MyImportSelector.class})

6.1.3 基于ImportBeanDefinitionRegistrar的使用

新建一个ImportBeanDefinitionRegistrar如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 定义一个自定的ImportBeanDefinitionRegistrar
*
* @author
* @date 2018年5月1日
*/
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) {
// new一个RootBeanDefinition
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Rectangle.class);
// 注册一个名字叫rectangle的bean
registry.registerBeanDefinition("rectangle", rootBeanDefinition);
}
}

修改MainConfig注解配置如下:

1
@Import({Square.class,Circular.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})


本文大部分转自:51CTO博客-知了123