В Spring, можно ли вызывать методы других бинов внутри метода, помеченного @PostConstruct?

«В Spring, можно ли вызывать методы других бинов внутри метода, помеченного @PostConstruct?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, можно. Spring гарантирует, что все зависимости бина (инжектированные через @Autowired, @Inject и т.д.) будут внедрены до вызова метода с аннотацией @PostConstruct. Это делает вызов методов других бинов безопасным.

Почему это работает: Жизненный цикл бина включает инъекцию зависимостей, затем выполнение методов @PostConstruct. Поэтому к моменту вызова init() все поля, такие как serviceB, уже проинициализированы.

Пример:

@Service
public class ServiceA {
    @Autowired
    private ServiceB serviceB;

    @PostConstruct
    public void init() {
        // ServiceB уже готов к использованию
        serviceB.doSomething();
    }
}

@Service
public class ServiceB {
    public void doSomething() {
        System.out.println("ServiceB works!");
    }
}

Важное замечание: Следите за циклическими зависимостями. Если ServiceB также зависит от ServiceA и имеет свой @PostConstruct, это может привести к исключению во время создания контекста.