Весенний заказ электропроводки и @PostConstruct

У меня вопрос по порядку автопроводки и@PostConstruct логика весной. Например, после демонстрационного кода у меня есть основной класс Spring Boot:

@SpringBootApplication
public class Demo1Application {

    @Autowired
    BeanB beanb;

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

и 2@Service Определения:

@Service
public class BeanB {

    @Autowired
    private BeanA beana ;

    @PostConstruct
    public void init(){
        System.out.println("beanb is called");
    }

    public void printMe(){
        System.out.println("print me is called in Bean B");
    }
}

@Service
public class BeanA {

    @Autowired
    private BeanB b;

    @PostConstruct
    public void init(){
        System.out.println("bean a is called");
        b.printMe();
    }
}

и у меня есть следующий вывод:

боб называется

напиши меня называется в Бин Б

beanb называется


Мой вопрос: как происходит автоматическое подключение, как в сценарии выше?
И какprintMe() методbeanb называется без вызова его@PostConstruct первый?

Ответы на вопрос(2)

Ниже должна быть возможная последовательность

beanb начинает получать автопроводкуВо время инициализации классаBeanbБина начинает замаскироватьсяКак только бина создается@PostConstruct то естьinit() бина называетсявнутриinit(), System.out.println("bean a is called"); вызываетсязатемb.printMe(); вызывается вызываяSystem.out.println("print me is called in Bean B"); выполнитьИмеяbeana завершил@PostConstruct то естьinit() изbeanb вызываетсязатемSystem.out.println("beanb is called"); вызывается

В идеале то же самое можно лучше наблюдать отладчиком в затмении.

Пружинный справочник объясняет, как разрешаются циклические зависимости. Бобы сначала создаются, а затем вводятся друг в друга.

 Aditya Gupta28 сент. 2017 г., 12:40
Ссылка на сайт на круговое разрешение зависимостей.

Ваш ответ правильный, как показано в вашем вопросе.

Теперь получение понятия нотации@Autowired, Все@Autowired Объекты инициализируются и загружаются в память сразу после завершения загрузки класса.

Теперь вот вашSpringBootApplication

@SpringBootApplication
public class Demo1Application {
    @Autowired
    BeanB beanb;   // You are trying to autowire a Bean class Named BeanB.

Здесь выше Консольное приложение, которое вы пишете, пытается автоматически подключить и внедрить объект типаBeanB.

Теперь вот ваше определениеBeanB

@Service
public class BeanB {

    @Autowired
    private BeanA beana ;

ВBeanB класс, который вы пытаетесь ввести объект классаBeanA который также определен в вашем консольном проекте.

Итак, в вашемDemo1Application ввести объект классаBeanB там должно быть необходимо ввести объект классаBeanA, СейчасBeanA Объект класса создается первым.

Теперь, если вы видите определение вашего классаBeanA

 @Service
public class BeanA {

    @Autowired
    private BeanB b;

    @PostConstruct   // after Creating bean init() will be execute.
    public void init(){
        System.out.println("bean a is called");
        b.printMe();
    }
}

Итак, после введения объектаBeanA метод связать с@PostContruct аннотация собирается выполнить.

Итак, поток выполнения будет ..

System.out.println("bean a is called");
System.out.println("print me is called in Bean B");
System.out.println("beanb is called");

Ваш ответ на вопрос