Ответ
Да, метод @PostConstruct у singleton-бина выполняется ровно один раз, но при соблюдении следующих условий:
- Контекст Spring успешно создан и запущен.
- Бин успешно инстанциирован (нет неразрешимых зависимостей или исключений в конструкторе).
- Контекст не был закрыт до момента обращения к бину (для ленивых бинов).
Ключевые моменты:
- Для eager-бинов (по умолчанию): Метод выполняется во время инициализации контекста.
- Для lazy-бинов (
@Lazy): Метод выполняется при первом запросе бина из контекста. - Порядок: На порядок выполнения может влиять аннотация
@DependsOn.
Пример и исключения:
@Component // Singleton scope по умолчанию
public class ServiceBean {
@PostConstruct
public void init() {
System.out.println("PostConstruct executed for singleton bean.");
}
}
Когда @PostConstruct НЕ выполнится:
- Если бин создан вручную через
new ServiceBean()(вне управления Spring). - Если в методе
@PostConstructили на предыдущих этапах жизненного цикла (например, в конструкторе) возникло необработанное исключение. - Если контекст Spring был уничтожен (
context.close()) до инициализации lazy-бина.