1. 程式人生 > >Spring原始碼窺探之:ImportBeanDefinitionRegistrar

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