1、@Import快速导入一个组件
容器中注册组件的方式:
①包扫描+组件注解(@Controller、@Service、@Repository、@Component)
②@Bean
③@Import:值是一个Class[],容器会注册被导入的类,可用来导入第三方的类对象,或者一个包下仅有极少数的类需要被纳入IOC容器管理时,导入对象的id默认为组件的全类名
@Configuration
@Import({Student.class,Teacher.class})
public class MainConfig {
@Bean
@Conditional({MyCondition.class})
public Person person(){
return new Person("张三",12);
}
@Bean
public Person person1(){
return new Person("李四",13);
}
}
ImportSelector:是一个接口,子类需实现其selectImports方法,该方法的入参是AnnotationMetadata(可获取当前标注@Import注解的类的所有注解信息),返回需要导入的组件的全类名数组,不能返回null,否则会报空指针异常
public class MyImportSelector implements ImportSelector{
public String[] selectImports(AnnotationMetadata metadata) {
return new String[]{"com.bdm.modle.Teacher"};
}
}
使用ImportSelector:可实现有条件的导入
@Configuration
@Import({Student.class,MyImportSelector.class})
public class MainConfig {
@Bean
@Conditional({MyCondition.class})
public Person person(){
return new Person("张三",12);
}
}
此时容器中导入的类除了Student之外,还包括MyImportSelector的selectImports方法中返回的数组
ImportBeanDefinitionRegistrar:也是一个接口,子类需实现其registerBeanDefinitions方法,该方法的入参是AnnotationMetadata(获取类的注解信息)和BeanDefinitionRegistry(调用其registerBeanDefinition方法注册Bean),通过实现此接口可以使容器手工注册组件
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
boolean flag = registry.containsBeanDefinition("person");//如果容器中含有person
if(flag) {
RootBeanDefinition beanDefinition = new RootBeanDefinition(Teacher.class);
//指定bean的id
registry.registerBeanDefinition("teacher", beanDefinition);
}
}
}
@Configuration
@Import({Student.class,MyImportBeanDefinitionRegistrar.class})
public class MainConfig {
@Bean
@Conditional({MyCondition.class})
public Person person(){
return new Person("张三",12);
}
}