一、给容器中注册组件:
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