實用@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 的實現
