- 给容器中注册组件的方式:
1.包扫描+组件标注注解(@Controller,@Service,@Repository,@Component ){局限于自己写的}
2.@Bean{导入第三方包里面的组件}
3.@Import{快速的给容器中导入一个组件}
- ImportSelector:返回需要导入的组件的全类名数组
定义一个类MyImportSelector:
// 自定义逻辑,返回需要导入的组件
public class MyImportSelector implements ImportSelector {
/**
* @param annotationMetadata :当前标注@Import注解的类的所有注解信息
* @return:返回值就是需要导入到容器中的组件的全类名
*/
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{"demo1.Blue"};
}
}
ImportBeanDefinitionRegistrar:
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
*
* @param annotationMetadata:当前类的注解信息
* @param beanDefinitionRegistry:beanDefinition注册类
* 把所有需要注册到容器中的bean:
* 调用beanDefinitionRegistry.registerBeanDefinition手工注册进来
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
boolean blue = beanDefinitionRegistry.containsBeanDefinition("demo1.Blue");
if (blue){
// 指定bean名
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Red.class);
// 注册一个bean,指定bean名
beanDefinitionRegistry.registerBeanDefinition("blues",rootBeanDefinition);
}
}
}