Ответ
Метод, аннотированный @PostConstruct, вызывается после того, как Spring полностью внедрит все зависимости (проведёт инъекцию) в бин, но до того, как бин будет готов к использованию клиентом.
С чем можно взаимодействовать:
- Все поля бина, помеченные
@Autowired,@Injectили@Resource. К этому моменту они уже проинициализированы. - Состояние самого бина. Вы можете безопасно выполнять настройку на основе инжектированных зависимостей.
Пример:
@Service
public class CacheService {
@Autowired
private SomeRepository repository; // Уже инжектирован
private Map<String, Data> cache;
@PostConstruct
public void initCache() {
// Можно использовать repository
List<Data> data = repository.findAll();
this.cache = data.stream()
.collect(Collectors.toMap(Data::getId, Function.identity()));
}
}
Важные ограничения и «нельзя»:
- Нет гарантий порядка между
@PostConstructразных бинов, если он не задан явно через@DependsOn. - Контекст транзакций ещё не активен. Нельзя выполнять операции, требующие транзакционность.
- Не стоит выполнять долгие операции, так как это задержит полную инициализацию контекста приложения.
- Бин ещё не прошёл через возможные Spring AOP-прокси, поэтому вызовы методов внутри
@PostConstructне будут перехватываться advice'ами (если только это не self-injection).