1、@Configuration注解结合@Bean注解向Spring容器中注册bean;
2、可以按照条件向Spring容器中注册bean;(Conditional)
3、可以使用@Import注解向容器中快速导入bean对象;可以在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean。
4、向容器中注册Bean,实现FactoryBean<>接口;
Import源码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
Class>[] value();
}
可以多个导入,也可以单个导入;由源码可知,数组;
@Import({Color.class, Red.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})// @Import快速地导入组件,id默认是组件的全类名
2、在@Import注解中使用ImportSelector接口导入bean
ImportSelector接口是Spring中导入外部配置的核心接口,在Spring Boot的自动化配置和@EnableXXX(功能性注解)都有它的存在。我们先来看一下ImportSelector接口的源码,如下所示。
在ImportSelector接口的selectImports()方法中,存在一个AnnotationMetadata类型的参数,这个参数能够获取到当前标注@Import注解的类的所有注解信息,也就是说不仅能获取到@Import注解里面的信息,还能获取到其他注解的信息。
首先,我们创建一个MyImportSelector类实现ImportSelector接口,使用Import将MyImportSelector类注册到Import中;ImportSelect返回的是一个数组;
注意:Import的id默认是组件的全类名;所以:要想用ImportSelector接口,必须写全类名;
public class MyImportSelector implements ImportSelector {
// 返回值:就是要导入到容器中的组件的全类名
// AnnotationMetadata:当前标注@Import注解的类的所有注解信息,也就是说不仅能获取到@Import注解里面的信息,还能获取到其他注解的信息
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.baidu.bean.Blue","com.baidu.bean.Yellow"};// 可以返回一个空数组
}
}
3、在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//容器中同时拥有Blue,和Yellow 在向容器中添加rainBow
boolean definition = registry.containsBeanDefinition("com.baidu.bean.Blue");
boolean definition2 = registry.containsBeanDefinition("com.baidu.bean.Yellow");
if (definition && definition2){
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(RainBow.class);
registry.registerBeanDefinition("rainBow",rootBeanDefinition);
}
}
}



