测试环境(配置类)
@Import({User.class,Pet.class})
@Configuration(proxyBeanMethods = true)
public class MyConfig {
@Bean
@ConditionalOnBean(name = "cat")
public User user(){
return new User("航书", 12);
}
@Bean("cat")
public Pet dog(){
return new Pet("狗");
}
}
测试代码:
String[] names = run.getBeanNamesForType(Pet.class);
for (String name : names) {
System.out.println(name);
}
System.out.println("--------------------------------------------------------");
boolean cat = run.containsBean("cat");
System.out.println(cat);
boolean user2 = run.containsBean("user");
System.out.println(user2);
打印测试结果:
结果分析:
com.zhmsky.boot.pojo.Pet:这是通过@Import自动导入的组件
cat:通过@Bean 注册的组件
IOC容器中包含cat组件,但是没有包含user组件,也就是此时条件配置注解失效
解决办法:
注意条件注解中的条件组件必须要先完成注册,也就也是条件里的判断组件必须要先包含在IOC容器中。
@Import({User.class,Pet.class})
@Configuration(proxyBeanMethods = true)
public class MyConfig {
@Bean("cat")
public Pet dog(){
return new Pet("狗");
}
@Bean
@ConditionalOnBean(name = "cat")
public User user(){
return new User("航书", 12);
}
}
此时条件注解生效!
结论:
springboot加载组件有一定的顺序,条件注解里的判断条件一定要先注册(@ConditionalOnBean(name = “cat”) 对应cat组件先完成注册
)