Я создал простой компонент.
Синхронное обновление:
@Component
public class BeanTest {
private String postConstructValue;
@PostConstruct
public void init(){
try {
Thread.sleep(5000);
this.postConstructValue = "Construction done";
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Scheduled(fixedRate = 500)
public void print(){
System.out.println(
this.postConstructValue
);
}
}
- Потребовалось некоторое время для запуска приложения (более 5 секунд) потому что мы смоделировали некоторый трудоемкий процесс в пост-конструкции. Метод печати по расписанию начал печатать только после запуска приложения. Он начал печатать сообщение «Строительство завершено».
Асинхронное обновление:
@Component
public class BeanTest {
private String postConstructValue;
@PostConstruct
public void init(){
Flux.just("Construction done")
.delayElements(Duration.ofSeconds(5))
.subscribe(s -> this.postConstructValue = s);
}
@Scheduled(fixedRate = 500)
public void print(){
System.out.println(
this.postConstructValue
);
}
}
- Теперь при таком подходе приложение запускалось в течение 2 секунд , Способ печати, начиная печать
null
в течение нескольких секунд. Тогда это начало печатать "Строительство закончено". Это не прекращает обновление значения Flux postConstruct. Это произошло асинхронно.
Реактивный подход хорош, когда вам нужно неблокирующее поведение и выполнение чего-либо асинхронно. Если вы думаете, что создание вашего компонента должно ждать правильной конструкции, вам придется заблокировать! В противном случае вы можете go со вторым подходом.