向IOC容器中注入bean的方式
@Import:是导入组件的一种注解,是选择性的注入。
- @Bean 注释
@Configuration
public class MainConfig {
// @Bean 注解默认可以不指定bean的名称,IOC实例化后的实例名称就是这个方法名
@Bean("person")
// @Bean
public Person person() {
return new Person("老大", "30");
}
}
- @Import 注解 导入
@Configuration
//@Import(Dog.class)
@Import({Dog.class, Cat.class})
public class MainConfig {
@Bean("person")
public Person person() {
return new Person("小二", "28");
}
}
- @Import 注解 + ImportSelector
public class TestImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
// 方法不要返回null
return new String[]{"org.xiaobuisme.example.cap6.Fish", "org.xiaobuisme.example.cap6.Tiger"};
}
}
@Configuration
//@Import(Dog.class)
//@Import({Dog.class, Cat.class})
@Import({Dog.class, Cat.class, TestImportSelector.class})
public class MainConfig {
@Bean("person")
public Person person() {
return new Person("老3", "20");
}
}
- @Import + ImportBeanDefinitionRegistrar
/**
* ImportBeanDefinitionRegistrar:
*/
public class TestImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* containsBeanDefinition(): 是否存在某个类的定义
* registerBeanDefinition(): 注册实例bean
*
* @param annotationMetadata 注解类信息
* @param registry bean注册器
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
boolean beanDefinition1 = registry.containsBeanDefinition("org.xiaobuisme.example.cap6.Dog");
boolean beanDefinition2 = registry.containsBeanDefinition("org.xiaobuisme.example.cap6.Cat");
if (beanDefinition1 && beanDefinition2) {
RootBeanDefinition beanDefinition = new RootBeanDefinition(Pig.class);
registry.registerBeanDefinition("pig", beanDefinition);
}
}
}
@Configuration
//@Import(Dog.class)
//@Import({Dog.class, Cat.class})
@Import({Dog.class, Cat.class, TestImportSelector.class, TestImportBeanDefinitionRegistrar.class})
public class MainConfig {
@Bean("person")
public Person person() {
return new Person("小4", "20");
}
}
验证 以上方式是否可以成功注入实例bean
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.xiaobuisme.example.cap6.MainConfig;
import org.xiaobuisme.example.cap6.Fish;
import org.xiaobuisme.example.cap6.Pig;
public class Test {
public static void main(String[] args) {
ApplicationContext anno = new AnnotationConfigApplicationContext(MainConfig.class);
String[] beanNames = anno.getBeanDefinitionNames();
for (String beanName : beanNames) {
System.out.println(beanName);
}
// 验证通过导入组件工具TestImportSelector导入的类实例是否存在
Fish fish = anno.getBean(Fish.class);
System.out.println(fish);
// 验证通过ImportBeanDefinitionRegistrar 工具导入的类实例是否导入成功
Pig pig = anno.getBean(Pig.class);
System.out.println(pig);
}
}