使用Spring基础组件导入、注册bean实例

向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);
    }
}

你可能感兴趣的:(spring,java)