Неожиданное поведение для ConditionalOnBean в Spring-boot - PullRequest
1 голос
/ 03 июля 2019

Я пытался понять примеры @ ConditionalOnBean и столкнулся с такой ситуацией, что Условный компонент инициализируется перед компонентом, от которого он зависит. Ниже мой пример,

Основной класс

  @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");
    }
}

Класс С

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

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

1026 Мощн * *

Loading A
Loading C
Loading B from A
Loading B

Я не могу понять, почему C загружается до B, поскольку C зависит от самого B.

Согласно определению в вики,

Условно, который соответствует только тогда, когда компоненты, отвечающие всем указанным требованиям, уже содержатся в BeanFactory.

Я не понимаю, как фабрика бобов может содержать бин, который еще не инициализирован.

Пожалуйста, кто-нибудь может объяснить это?

1 Ответ

0 голосов
/ 03 июля 2019

Вы добавили @Configuration или @Component в класс B. На вопрос, я не вижу такой аннотации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...