Comments 7
У меня как раз недавно такая задача была - по окончанию загрузки Spring Boot надо было выполнить некоторые действия.
С @PostConstructне прокатило - пока это выполнялось - приложение не отвечало
В последнем варианте не описано где должен находиться класс BeanInitMethodImpl.
В том же пакете что DemoApplication и или иметь какую-то аннотацию? Не ясно как Spring будет искать метод (по имени) который нужно выполнить и что будет если несколько классов будут иметь метод с таким именем. Будет ли вызвано исключение, если среди найденных по имени методов часть будут иметь входные параметры или тип выходного значения отличный от void. Ну или все неподходящий по сигнатуре методы проигнорируются.
Ещё интересный момент, если метод будет бросать проверяемое исключение, он сможет бы использован на предзагрузке?
Написано же,
Метод, предоставленный в initMethod, должен быть void и не иметь аргументов. Этот метод может быть даже private.
initMethod - это метод создаваемого бина. Де-факто, то же самое, что и @PostConstruct, только через механизмы spring, а не стандартные java-овые.
Когда нам нужно было проделать манипуляции в БД с поддержкой транзакций, но до полной загрузки приложения, мы использовали интерфейс SmartInitializingSingleton.
При вызове метода, помеченного аннотацией @PostConstruct , транзакции еще не работают
Если нужна конфигурация бина то можно так
@SpringBootConfiguration
public class Configuration {
...
...
@Autowired
public void registerCustomConverters(FormatterRegistry registry) {
registry.addConverter(new StringToRangeHeaderConverter());
}
}
К модификатору доступа у метода с аннотацией @PostConstruct есть вопрос: а не должен ли он быть private?
Не нарушением ли мы инкапсуляцию, добавляя метод как часть контракта?
6 способов выполнения метода при старте Spring Boot приложения