一、给容器中注册组件:

1、组件扫描@componentscan + 组件标注注解(@controller,@service,@repository,@compoennt)

2、@Bean

3、@import

4、FactoryBean方式(此方式applicationContext.getBean("beanname")或取的实际是getObject方法返回的bean,要想获得factorybean,需要加上&前缀)

二、import快速导入

@Configuration
@Import(value={Red.class})
public class ConfigurationBean {
    @Bean("person") 
    public Person getPerson() {
        Person person = new Person();
        person.setAge(25);
        person.setName("小东");
        return person;
    }
    
    @Bean("billGates") 
    public Person getBillGates() {
        Person person = new Person();
        person.setAge(66);
        person.setName("billGates");
        return person;
    }
}
public class Red {

}
String[] beanNames = applicationContext.getBeanDefinitionNames();
for(String beanName : beanNames) {
      System.out.println("beanName:" + beanName);
}

打印:

beanName:org.springframework.context.annotation.internalConfigurationAnnotationProcessor
beanName:org.springframework.context.annotation.internalAutowiredAnnotationProcessor
beanName:org.springframework.context.annotation.internalRequiredAnnotationProcessor
beanName:org.springframework.context.annotation.internalCommonAnnotationProcessor
beanName:org.springframework.context.event.internalEventListenerProcessor
beanName:org.springframework.context.event.internalEventListenerFactory
beanName:configurationBean
beanName:com.suxiaodong.annotation.Red
beanName:person
beanName:billGates

三、ImportSelector导入方式

public class RedImportSelector implements ImportSelector{
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{Red.class.getName()};
    }
}
@Configuration
@Import(value=RedImportSelector.class)
public class ConfigurationBean {
    @Bean("person") 
    public Person getPerson() {
        Person person = new Person();
        person.setAge(25);
        person.setName("小东");
        return person;
    }
    @Bean("billGates") 
    public Person getBillGates() {
        Person person = new Person();
        person.setAge(66);
        person.setName("billGates");
        return person;
    }
}

四、ImportBeanDefinitionRegistrar方式

public class RedImportBeanDefinetionRegister implements ImportBeanDefinitionRegistrar{
    @Override
    public void registerBeanDefinitions(
            AnnotationMetadata importingClassMetadata,
            BeanDefinitionRegistry registry) {
        BeanDefinition definition = new RootBeanDefinition(Red.class);
        registry.registerBeanDefinition("red", definition);
    }
}
@Configuration
@Import(value=RedImportBeanDefinetionRegister.class)
public class ConfigurationBean {
    @Bean("person") 
    public Person getPerson() {
        Person person = new Person();
        person.setAge(25);
        person.setName("小东");
        return person;
    }
    
    @Bean("billGates") 
    public Person getBillGates() {
        Person person = new Person();
        person.setAge(66);
        person.setName("billGates");
        return person;
    }
}

 五、factorybean方式

@Configuration
public class ConfigurationBean {
    @Bean("redFactoryBean")
    public RedFactoryBean getRedFactoryBean() {
        return new RedFactoryBean();
    }
}
public class RedFactoryBean implements FactoryBean<Red>{

    @Override
    public Red getObject() throws Exception {
        return new Red();
    }

    @Override
    public Class<?> getObjectType() {
        return Red.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }

}
Object bean = applicationContext.getBean("redFactoryBean");
System.out.println("currentBean=" + bean.getClass());

结果:

currentBean=class com.suxiaodong.annotation.Red