Spring-boot中ConditionalOnBean的意外行为

时间:2019-07-03 10:22:23

标签: java spring spring-boot spring-bean

我正在尝试通过示例了解 @ConditionalOnBean ,并遇到了这样一种情况,即条件Bean在依赖它的Bean之前被初始化。下面是我的示例,

  

主类

  @SpringBootApplication
  @ComponentScan
  public class MainConditionalOnBean {

      public static void main(String[] args) {
          SpringApplication.run(MainConditionalOnBean.class, args);
      }

  }
  

A级

@Component
public class A {

    @PostConstruct
    public void loadA() {
        System.out.println("Loading A");
    }

    @Bean
    public B getB() {
        System.out.println("Loading B from A");
        return new B();
    }
}
  

B级

public class B {

    @PostConstruct
    public void loadB() {
        System.out.println("Loading B");
    }
}
  

C类

    @Configuration
    @ConditionalOnBean(B.class)
    public class C {

        @PostConstruct
        public void loadC() {
            System.out.println("Loading C");
        }
    }
  

OutPut

Loading A
Loading C
Loading B from A
Loading B

我不明白为什么C在B之前加载,因为C依赖于B本身。

按照Wiki中的定义

  

仅当满足所有指定要求的bean已包含在BeanFactory中时,才匹配条件。

我不知道bean工厂如何包含尚未初始化的bean。

请,有人可以解释吗?

1 个答案:

答案 0 :(得分:0)

您是否在课程@Configuration上添加了@ComponentB。有问题,我看不到任何此类注释。