Spring原始碼窺探之:ImportBeanDefinitionRegistrar
阿新 • • 發佈:2018-12-13
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