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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM