当@ConditionalOnMissingBean作用于自身时,会出现相反的情况

@Configuration
@ConditionalOnMissingBean(Config01.class)
public class Config01 {

    public Config01(){
        System.out.println("Config01 has been created");
    }

}

@ConditionalOnMissingBean本身是当容器中不存在某个Bean时会去执行下面的类,但是在上面代码中,结果出现了相反的状况,一开始我认为,Config01一开始肯定不在容器里,所以Config会被加载到容器中,但是结果恰恰相反,Config01并没有被创建,但是当我将@ConditionalOnMissingBean改成@ConditionalOnBean时,结果恰恰相反,这个类被创建了。有没有大神替我解答一下疑惑。虽然一般人不会这么干。但是还是希望明白设什么原因造成这个情况

当@ConditionalOnMissingBean起作用时,容器通过@ComponentScan已经注册了一个Config01类型的BeanDefinition了。所以会出现相反的结果。

在启动类里添加@Import(Config01.class),再去掉Config01上的@Configuration注解。就会出现题主预想到的结果,因为此时Config01已经去掉了@Configuration注解不会受@ComponentScan影响了。

1 个赞