@Import註解註解
- {@link Configuration} :可以放入一個配置類
-{@link ImportSelector} : ImportSelector
-{@link ImportBeanDefinitionRegistrar} :ImportBeanDefinitionRegistrar
public @interface Import {
/**
* {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
* or regular component classes to import.
*/
Class<?>[] value();
}
1 @Import(組件名):快速的向容器中註冊一個組件。 {@link Configuration}
容器中組件的id:組件的全類名。com.rayli.beans.Cat com.rayli.beans.Dog
@Configuration
@Import({Cat.class,Dog.class})
public class ConfigTest1 {
@Bean
public Person person() {
return new Person("gege", 789);
}
}
2 @Import註解,使用ImportSelector,向IOC容器中註冊組件。 -{@link ImportSelector}
ImportSelector是一個接口,使用它需要有一個它的實現了類。
public interface ImportSelector {
String[] selectImports(AnnotationMetadata importingClassMetadata);
}
2.1 創建實現類。實現ImportSelector 接口。返回包含要註冊組件的全類名數組。
public class MyImportSelector implements ImportSelector {
/**
* AnnotationMetadata參數:可以拿到使用該類的那個標註類的所有的註解信息。
*
* 不能返回null值,因爲後面會用到返回值的length屬性。
*
* 返回是一個String[]類型的數組,把想要註冊的類的全類名都放到數組中即可。
*
*/
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.rayli.beans.Ege","com.rayli.beans.Pig"};
}
}
2.2 使用ImportSelector,在@Import註解中使用即可。導入到IOC容器中的組件的id也是全類名。
@Configuration
@Import({Cat.class,Dog.class,MyImportSelector.class})
public class ConfigTest1 {
@Bean
public Person person() {
return new Person("gege", 789);
}
}
PS:其實ImportSelector和第一種寫入類沒有本質上的區別,如果需要註冊的組件比較多,可以寫一個類,把
要註冊的組件都放入這個類,即ImportSelector,進行一下封裝。
3 ImportBeanDefinitionRegistrar:手動註冊bean(可以指定bean在IOC容器的id)
3.1 繼承ImportBeanDefinitionRegistrar接口,向IOC容器中註冊類。
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* AnnotationMetadata:調用類的註解信息
* BeanDefinitionRegistry:註冊類信息
* 可以調用registerBeanDefinition()方法手工註冊bean
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//containsBeanDefinition()容器中是否包含該bean
boolean cat = registry.containsBeanDefinition("cat");
boolean dog = registry.containsBeanDefinition("pig");
if(cat && dog) {
/**
* registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
* beanName:要註冊的bean咋在IOC容器中的id,之前的方法在容器中的名字都是全類名。
* beanDefinition: 通過new RootBeanDefinition(Animal.class)來加載要註冊的bean
*/
RootBeanDefinition beanDefinition = new RootBeanDefinition(Animal.class);
registry.registerBeanDefinition("animal", beanDefinition);
}
}
}
3.2 配置課類中使用。
@Configuration
@Import({Cat.class,Dog.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
public class ConfigTest1 {
@Bean
public Person person() {
return new Person("gege", 789);
}
}