@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);
}
}