@ConditionOnBean注解添加到类上
@ConditionalOnBean(name = "tom")
@Configuration(proxyBeanMethods = true)
public class MyConfig {
@Bean
public User user01(){
User user = new User("zhangsan", tom());
return user;
}
@Bean
public Cat tom(){
return new Cat("xjz");
}
}
测试代码
MyConfig myConfig = (MyConfig) run.getBean("myConfig");
System.out.println(run.containsBean("user01"));
System.out.println(run.containsBean("tom"));
结果
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'myConfig' available
@ConditionOnBean注解添加到指定方法上面
@Configuration(proxyBeanMethods = true)
public class MyConfig {
@ConditionalOnBean(name = "tom")
@Bean
public User user01(){
User user = new User("zhangsan", tom());
return user;
}
@Bean
public Cat tom(){
return new Cat("xjz");
}
}
测试代码
MyConfig myConfig = (MyConfig) run.getBean("myConfig");
System.out.println(run.containsBean("user01"));
System.out.println(run.containsBean("tom"));
结果
======
false
true
@ConditionOnBean注解添加到指定方法上面
@Configuration(proxyBeanMethods = true)
public class MyConfig {
@Bean
public Cat tom(){
return new Cat("xjz");
}
@ConditionalOnBean(name = "tom")
@Bean
public User user01(){
User user = new User("zhangsan", tom());
return user;
}
}
测试代码
MyConfig myConfig = (MyConfig) run.getBean("myConfig");
System.out.println(run.containsBean("user01"));
System.out.println(run.containsBean("tom"));
结果
======
true
true
结论:@ConditionOnBean注解先判断容器里是否存在该实例,如果存在,才能够条件装配该注解对应得@Bean对应的实例或者@configuration类中@Bean对应的实例。所有的判断都是基于注解前容器是否存在注解@ConditionOnBean(name)中的name实例。
通过@ConditionOnBean注解可以做到当一个实例为另一个实例的依赖时,给依赖的@Bean添加@ConditionOnBean注解,使得被依赖的@Bean不存在时依赖的@Bean就无法添加到容器中