实用@Bean和@Import的示例
@Configuration
@Import({Dog.class, Cat.class})
public class DemoConfig {
@Bean("tom")
public Person getPerson3(){
System.out.println("没有添加@condition的普通bean:tom");
return new Person(1,"tom",12);
}
}
运行结果:
demoConfig
cn.enjoy.bean.Dog
cn.enjoy.bean.Cat
tom
从这里可以看出@import和@bean的区别
1、@import的id为全类名
2、@import使用更多功能
ImportSelector的使用,可以更加灵活加载bean
public class HonryImportSeletor implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"cn.enjoy.bean.Tiger","cn.enjoy.bean.Fish"};
}
}
加入到配置类中
@Configuration
@Import({Dog.class, Cat.class,HonryImportSeletor.class})
public class DemoConfig {
@Bean("tom")
public Person getPerson3(){
System.out.println("没有添加@condition的普通bean:tom");
return new Person(1,"tom",12);
}
}
执行结果:
demoConfig
cn.enjoy.bean.Dog
cn.enjoy.bean.Cat
cn.enjoy.bean.Tiger
cn.enjoy.bean.Fish
tom
ImportBeanDefinitionRegistrar接口的使用,可以通过条件控制想要加载的bean
public class HonryImportBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
boolean b = registry.containsBeanDefinition("cn.enjoy.bean.Dog");
boolean b1 = registry.containsBeanDefinition("cn.enjoy.bean.Fish");
//通过判断dog和fish在IOC容器中,才加载pig
if(b && b1){
RootBeanDefinition definition = new RootBeanDefinition(Pig.class);
registry.registerBeanDefinition("cn.enjoy.bean.Pig",definition);
}
}
}
配置@import加上
@Configuration
@Import({Dog.class, Cat.class,HonryImportSeletor.class,HonryImportBeanDefinitionRegister.class})
public class DemoConfig {
@Bean("tom")
public Person getPerson3(){
System.out.println("没有添加@condition的普通bean:tom");
return new Person(1,"tom",12);
}
}
输出结果:
demoConfig
cn.enjoy.bean.Dog
cn.enjoy.bean.Cat
cn.enjoy.bean.Tiger
cn.enjoy.bean.Fish
tom
@Import支持 三种方式
1.带有@Configuration的配置类
2. (4.2 版本之前只可以导入配置类,4.2版本之后 也可以导入 普通类)
3.ImportSelector 的实现
4.ImportBeanDefinitionRegistrar 的实现