@Import 注解可以普通類導入到 IoC容器中。
想要讓一個普通類接受 Spring 容器管理,有以下方法
- 使用 @Bean 注解
- 使用 @Controller @Service @Repository @Component 注解標注該類,然后再使用 @ComponentScan 掃描包
- @Import 方法,即現在這種方式
Student 類
public class Student {
}
配置類
@Configuration
@Import(Student.class)
public class ImportConfig {
}
測試代碼
@Test
public void test7() {
ApplicationContext ctx = new AnnotationConfigApplicationContext(ImportConfig.class);
String[] beanDefinitionNames = ctx.getBeanDefinitionNames();
for (String name : beanDefinitionNames) {
System.out.println(name);
}
}
觀察有沒有 Student 產生的 bean
結果
bean成功創建
以上導入普通的 Java 并將其聲明為一個 bean 功能在 4.2 之后才可以使用在 spring 4.2 以前,該注解,只能導入配置類,其功能與 <import /> 標簽類似
ImportSelector
ImportSelector : 返回需要導入的組件的全類名數組
MySelector 類
public class MySelector implements ImportSelector {
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"me.sjl.bean.Person"};
}
}
配置類
@Configuration
@Import(MySelector.class)
public class ImportConfig {
}
測試代碼不變,直接看結果
Person 類被加載
ImportBeanDefinitionRegistrar
BeanDefinitionRegistrar
public class MyBeanDefinitionRegistrat implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
BeanDefinition beanDefinition = new RootBeanDefinition(Person.class);
registry.registerBeanDefinition("PERSON", beanDefinition);
}
}
配置類
@Configuration
@Import(MyBeanDefinitionRegistrat.class)
public class ImportConfig {
}
測試代碼不變,直接看結果,看看是否有 PERSON 這個組件
PERSON 成功注冊