Порядок инициализации весны - PullRequest
2 голосов
/ 14 октября 2008

Предположим, у меня есть пара бобов:

<beans>
   <bean name="A" ... />
   <bean name="B" ... />
</beans>

«B» предоставляет удаленный сервис, который не нуждается в «A». Предположим, что «A» занимает немалое время для загрузки. Это означает, что во время цикла перезапуска приложение вешает удаленного клиента, который на самом деле может подключиться к серверу, но ожидает ответа до полной инициализации контейнера пружины.

Я бы хотел, чтобы удаленная служба «B» отвечала немедленно, даже если (в зависимости от состояния приложения) она может возвращать только NOT_READY или что-то подобное. Контейнер, однако, заставляет ждать, пока все его bean-компоненты инициализируются, даже если вы задаете bean-компоненты как lazy-init и независимо от порядка загрузки.

Я подозреваю, что наличие «B» немедленно означало бы, что spring должен был бы сделать доступным частично инициализированный контейнер, что звучит плохо. Тем не менее, я был бы признателен за любую информацию, полученную кем-либо о порядке инициализации, и за то, нашли ли вы какие-либо разумные обходные пути.

Ответы [ 2 ]

3 голосов
/ 17 октября 2008

Не относитесь к бину "A" напрямую. Вместо этого обращайтесь к бобу, который является ФАБРИКОЙ для боба "A"; таким образом, bean-компонент Factory может быть создан без использования инициализации для создания экземпляра «A». Вам, конечно, нужно будет реорганизовать ваши классы, которые ссылаются на «А», чтобы сначала извлечь «А».

Или вы можете создать компонент "AA", который является контейнером для компонента "A", который имеет состояние инициализации и который предоставляет интерфейс компонента "A"; после вызова он устанавливает свое состояние инициализации как не инициализированное и начинает инициализацию компонента "A" в некотором потоке; вызовы любых методов интерфейса «A» в «AA» могут затем либо блокировать, либо возвращать неготовый ответ, пока не завершится инициализация «A» в «AA».

Это все в некотором роде зависит от того, каково ваше определение «занимает незначительное время для загрузки». Почему для загрузки требуется немалое количество времени? Есть ли какая-то особенно сложная инициализация, которая происходит внутри A? Или A настолько чудовищно огромен, что душит JVM?

0 голосов
/ 14 октября 2008

Я не понимаю, почему «А загружается не пренебрежимо мало времени», но, возможно, вы могли бы лениво инициализировать себя путем рефакторинга А. Не используйте InitializingBean или обрабатывайте ApplicationEvent. Просто инициализируйте первый запрос для обработки. Это замедлит первый запрос!

Другая возможность - переместить инициализацию в отдельный поток, созданный компонентом, обрабатывающим ApplicationEvent. Поток вызывает метод инициализации компонента асинхронным способом. Будьте внимательны при обработке запросов к неинициализированному компоненту!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...