给容器中注册组件的方法
1、包扫描+组件标注注解@Configuration(@Controller/@Service/@Repository/@Component)
2、@Bean[导入的第三方包里面的组件]
3、@Import[快速给容器中导入一个组件]
3.1、@Import(到要入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名
3.2、ImportSelector返回需要导入组件的全类名数组;
3.3、ImportBeanDefinitionRegistrar:手动注册Bean到容器中
@Configuration
@Import({Color.class,Red.class,MyImportSelector.class})
public class MainConfig2 {
@Lazy
@Bean
public Person person() {
System.out.println("创建----------->>>>>>>>>");
return new Person("李四",99);
}
/**
* @Conditional({}) 按照一定的条件进行判断,满足条件给容器中注册bean
*
* 如果系统是windows,给容器注册("bill")
* 如果系统是linux,给容器注册("linus")
*/
@Conditional({WindowsCondition.class})
@Bean("bill")
public Person person2() {
return new Person("bill gates",66);
}
@Conditional({LinuxCondition.class})
@Bean("linus")
public Person person3() {
return new Person("linus",49);
}
}
MyImportSelector
/**
* 自定义逻辑返回需要导入的组件
*/
public class MyImportSelector implements ImportSelector{
/**
* 返回值,就是导入到容器中的组件全类名
* AnnotationMetadata:当前标注@Import注解的类的所有注解信息
*/
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[] {"com.spring.bean.Blue"};
}
}
MyImportBeanDefinitionRegistrar
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* AnnotationMetadata:当前类的注解信息
* BeanDefinitionRegistry:BeanDefinition注册类;
* 把所有需要添加到容器中的bean,
* 调用BeanDefinitionRegistry.registerBeanDefinition手工注册进来
*/
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
boolean r1 = registry.containsBeanDefinition("com.spring.bean.Red");
boolean r2 = registry.containsBeanDefinition("com.spring.bean.Blue");
if(r1 && r2) {
//指定Bean定义信息
RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
//注册一个Bean,指定bean名
registry.registerBeanDefinition("rainBow", beanDefinition);
}
}
}