第10小节:ImportBeanDefinitionRegistrar接口,该接口中有个方法registerBeanDefinitions,通过调用这个方法可以给容器中自己来添加一些方法,这个方法有个参数AnnotationMetadata,包含当前类的注解信息,BeanDefinitionRegistry:bean定义的注册类,可以通过它给容器中添加bean
.写一个类MyImportBeanDefinitionRegisterar继承 ImportBeanDefinitionRegistrar
在这个类中实现的逻辑是:
判断是否有red和blue组件,如果有则加rainbow加入到容器中:
public class MyImportBeanDefinitionRegisterar implements ImportBeanDefinitionRegistrar {
/**
*
* @param annotationMetadata 当前类的注解信息,当前类的其他信息都能获取到
* @param beanDefinitionRegistry :beanDefinitionRegistry注册类
* 把所有需要添加到容器中的bean,调用BeanDefinitionRegistry.registerBeanDefinition()手工注册进来
*/
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
//判断在容器中是否有color类,red类
boolean definition1=beanDefinitionRegistry.containsBeanDefinition(“red”);
boolean definition2=beanDefinitionRegistry.containsBeanDefinition(“blue”);
if(definition1&&definition2){
RootBeanDefinition beanDefinition=new RootBeanDefinition(RainBow.class);
beanDefinitionRegistry.registerBeanDefinition(“rainBow”,beanDefinition);
}
}
}
测试类:
@Test
public void testImport(){
printBeans(applicationContext);
Blue bean= applicationContext.getBean(Blue.class);
System.out.println(bean);
}
测试结果:
mainConfig2
com.atguigu.bean.Color
com.atguigu.bean.Red
com.atguigu.bean.Blue
com.atguigu.bean.Yellow
com.atguigu.bean.Blue@7c417213
测试小结:因为容器中red和blue的类名是大写,所以,容器中没有添加rainbow组件
修改MyImportBeanDefinitionRegisterar类中的注册方法registerBeanDefinitions()的判断条件:
boolean definition1=beanDefinitionRegistry.containsBeanDefinition(“com.atguigu.bean.Red”);
boolean definition2=beanDefinitionRegistry.containsBeanDefinition(“com.atguigu.bean.Red”);
public class MyImportBeanDefinitionRegisterar implements ImportBeanDefinitionRegistrar {
/**
*
* @param annotationMetadata 当前类的注解信息,当前类的其他信息都能获取到
* @param beanDefinitionRegistry :beanDefinitionRegistry注册类
* 把所有需要添加到容器中的bean,调用BeanDefinitionRegistry.registerBeanDefinition()手工注册进来
*/
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
//判断在容器中是否有color类,red类
boolean definition1=beanDefinitionRegistry.containsBeanDefinition(“com.atguigu.bean.Red”);
boolean definition2=beanDefinitionRegistry.containsBeanDefinition(“com.atguigu.bean.Red”);
if(definition1&&definition2){
//指定bean定义信息,(bean的类型。bean的scope。。。。。)
RootBeanDefinition beanDefinition=new RootBeanDefinition(RainBow.class);
//注册一个bean,指定bean名
beanDefinitionRegistry.registerBeanDefinition(“rainBow”,beanDefinition);
}
}
}
测试类不变
测试结果:
mainConfig2
com.atguigu.bean.Color
com.atguigu.bean.Red
com.atguigu.bean.Blue
com.atguigu.bean.Yellow
rainBow
com.atguigu.bean.Blue@6ab7a896
测试结果小结:因为容器中存在red和blue组件中,所以添加了rainbow组件
@Import【快速给容器中导入一个组件】
@Import(要导入到容器中的组件)
@ImportSelector:返回需要导入的组件的全类名数组
@ImportBeanDefinitionRegisterar:手动注册bean到容器中