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