Как я могу определить, был ли обновлен Spring ApplicationContext без использования прослушивателя событий?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как я могу определить, был ли обновлен Spring ApplicationContext без использования прослушивателя событий?

Сообщение Anonymous »

У меня есть экземпляр Spring ApplicationContext в методе, и мне нужно «проверить» его и решить, был ли:
  • он был полностью обновлен() хотя бы один раз, поэтому я могу быть уверен, что beanFactory завершил создание всех своих компонентов и
  • никакое последующее обновление() в настоящее время не выполняется. прогресс
Важное ограничение: в моем случае использования я не могу использовать прослушиватель для ContextRefreshedEvent. Я могу работать только с переданным мне applicationContext, что могло произойти во время обновления(), до или после него.
Если вы посмотрите на org.springframework.context.support.AbstractApplicationContext#refresh, вы увидите, среди прочего, следующие шаги:

Код: Выделить всё

    public void refresh() throws BeansException, IllegalStateException {
// :
prepareRefresh();  // makes this.isActive() return true

// :
finishBeanFactoryInitialization(beanFactory);
// internally calls:
// beanFactory.freezeConfiguration()  -> makes beanFactoroy.isConfigurationFrozen() return true
// beanFactory.preInstantiateSingletons()

// :
finishRefresh();
}
Приведенный выше выбор шагов подчеркивает тот факт, что ConfigurableApplicationContext.isActive() и ConfigurableListableBeanFactory.isConfigurationFrozen(), которые я пробовал, не гарантируют, что beanFactory.preInstantiateSingletons() был завершен, что очень важно в моем случае.
/>В идеале я бы ожидал
  • Метод ConfigurationApplicationContext.isRefreshed(), который будет указывать, был ли контекст полностью обновлен хотя бы один раз, и
  • КонфигурируемыйApplicationContext.isBeingRefreshed(), который будет указывать, было ли обновление, первое или следующий в настоящее время находится в разработке.
Схематически они вписываются в существующий метод обновления() следующим образом:

Код: Выделить всё

    public void refresh() throws BeansException, IllegalStateException {
// Addition 1
setIsBeingRefreshed(true)

// :
prepareRefresh();

// :
finishBeanFactoryInitialization(beanFactory);

// Addition 2
setIsBeingRefreshed(false)
setIsRefreshed(true)

// :
finishRefresh();
}
При наличии этого я мог бы проверить, есть ли isRefreshed() && !isBeingRefreshed(), чтобы убедиться, что у меня «стабильный» и обновленный контекст.
Но таких методов не существует, поэтому мне интересно, знаете ли вы что-нибудь эффективно эквивалентное.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... ut-using-a
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»