- @Import注解的作用是把类加入Spring IOC容器。
- Spring Boot 有多种方式能让类加IOC容器管理,如@Bean、@Component等,@Import是另外一种方式,更加快捷
参数 |
描述 |
value |
指定导入的类class,默认为{},即当前类 |
- @Import的三种使用:
- .class数组方式
- ImportSelector方式(Spring Boot底层采用比较得多的方式)
- ImportBeanDefinitionRegistrar方式
class数组方式
- 假设有两个要加入IOC容器的类TestA、TestB
示例
- TestA.java
@Data
public class TestA {
private String name = "TestA";
public void print(){
System.out.println(this.toString());
}
}
- TestB.java
@Data
public class TestB {
private String name = "TestB";
public void print(){
System.out.println(this.toString());
}
}
- ImportConfig.java
@Import({TestA.class, TestB.class})
@Configuration
public class ImportConfig {
…
}
ImportSelector 接口实现方式
- 实现ImportSelector接口,重写selectImports()方法,返回要导入到容器中的类的全类名数组给ImportSelector
示例
- TestC.java
@Data
public class TestC {
private String name = "TestC";
public void print(){
System.out.println(this.toString());
}
}
- TestImportConfig.java
public class TestImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { return new String[]{"com.xmotor.test_import_annotation.model.TestC"}; } } |
- ImportConfig.java
@Import({TestImportSelecto.class})
@Configuration
public class ImportConfig {
…
}
ImportBeanDefinitionRegistrar 接口实现方式
- 通过实现ImportBeanDefinitionRegistrar接口,重写registerBeanDefinitions()方法,注册导入类到BeanDefinitionRegistry中
- 与ImportSelector接口的区别是可以自定义Bean在容器中的名称
示例
- TestD.java
@Data
public class TestD {
private String name = "TestD";
public void print(){
System.out.println(this.toString());
}
}
- TestImportBeanDefinitionRegistrar.java
public class TestImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) { RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(TestD.class); registry.registerBeanDefinition("testD1111",rootBeanDefinition);//自定义注册bean } } |
- ImportConfig.java
@Import({TestImportBeanDefinitionRegistrar.class})
@Configuration
public class ImportConfig {
…
}