Spring源码窥探之:ImportBeanDefinitionRegistrar

1. 编写实现ImportBeanDefinitionRegistrar的类

/**
 * description
 *
 * @author 70KG
 * @date 2018/11/13
 */
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        // 获取容器中已经存在的Bean的名字
        boolean definition1 = registry.containsBeanDefinition("com.nmys.story.springCore.springioc.importBean.Cat");
        boolean definition2 = registry.containsBeanDefinition("com.nmys.story.springCore.springioc.importBean.Dog");
        if (definition1 && definition2) {
            // 将需要放入容器中的Bean用RootBeanDefinition来包装一下。
            RootBeanDefinition beanDefinition = new RootBeanDefinition(Pig.class);
            // 向容器中注册这个Bean,并给定一个名字。
            registry.registerBeanDefinition("pig", beanDefinition);
        }
    }
}

以上代码的意思是,从容器中尝试获取Cat和Dog,如果两者都存在,那么就向容器中注入Pig类。有条件,有选择性的向容器中注入Bean

2. 配置类

/**
 * description
 *
 * @author 70KG
 * @date 2018/11/13
 */
@Configuration
@Import(value = {Cat.class, Dog.class, MyImportBeanDefinitionRegistrar.class})
public class MyImportBeanDefinitionRegistrarConfig {

}

3. 测试类

/**
 * description
 *
 * @author 70KG
 * @date 2018/11/13
 */
public class Test02 {

    @Test
    public void test() {

        // IOC容器创建(容器类似一个Map)
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MyImportBeanDefinitionRegistrarConfig.class);

        System.out.println("IOC容器初始化完成。。。。。");

        // 从容器中获取所有的bean的ID
        String[] definitionNames = ac.getBeanDefinitionNames();

        for (String name : definitionNames) {
            System.out.println("------->" + name);
        }

    }

}

4. 结果

IOC容器初始化完成。。。。。
------->org.springframework.context.annotation.internalConfigurationAnnotationProcessor
------->org.springframework.context.annotation.internalAutowiredAnnotationProcessor
------->org.springframework.context.annotation.internalRequiredAnnotationProcessor
------->org.springframework.context.annotation.internalCommonAnnotationProcessor
------->org.springframework.context.event.internalEventListenerProcessor
------->org.springframework.context.event.internalEventListenerFactory
------->myImportBeanDefinitionRegistrarConfig
------->com.nmys.story.springCore.springioc.importBean.Cat
------->com.nmys.story.springCore.springioc.importBean.Dog
------->pig

猜你喜欢

转载自www.cnblogs.com/zhangjianbing/p/10114196.html