Заказ Spring Bean Инициализация
У меня есть несколько файлов контекста. Требование: один конкретный Bean (который делает некоторые изменения конфигурации) должен быть инициализирован первым среди остальных beans.
Есть ли способ сначала загрузить этот Bean?
Один параметр использует атрибут depend-on`. Но это потребует обновления всей остальной части beans, поэтому, похоже, это не лучшее решение.
У нас есть лучшие варианты?
Ответы
Ответ 1
IMHO вам стоит подождать, пока они не исправят https://jira.spring.io/browse/SPR-3948
Одним из возможных способов является использование зависимого атрибута. Но опять же, я не хочу добавлять этот атрибут во все остальное beans (для меня это, вероятно, последнее средство).
На самом деле вам не нужно использовать зависимости от КАЖДОГО И КАЖДОГО BEAN в каждом приложении applicationContext.xml.
Используйте <import />
во всех "нижних уровнях" applicationContext.xml, чтобы импортировать самый верхний applicationContext.xml.
И используйте атрибут зависимости в каждом определении BEAN только в самом верхнем applicationContext.xml, за исключением <bean />
, который вы хотите загрузить первым.
Ответ 2
In может иметь смысл требовать упорядочения beans, как правило, для технического beans (например, добавления MBeans) для загрузки перед бизнесом beans (так же, как это предлагается в http://jira.springframework.org/browse/SPR-3948)
Использование BeanPostProcessor - это еще один способ обеспечить некоторый порядок в вашем beans. Проверьте AbstractApplicationContext.refresh(), чтобы узнать, как это выполняется.
Ответ 3
Мне удалось повлиять на порядок запуска bean, аннотируя мой bean с помощью @Order
: см. http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/annotation/Order.html
Ответ 4
Я не эксперт Spring и, вероятно, буду кричать кем-то, кто есть. Но до тех пор...
Если есть место для двусмысленности, я бы предположил, что Spring загружает/применяет материал в том порядке, в котором он встречает его в файлах конфигурации. Таким образом, в качестве первого и самого простого приближения я попытался бы убедиться, что первое, что вы хотите инициализировать, является одной из первых в ваших файлах конфигурации.
Если все иерархическое, то вы хотите, чтобы ваши "первые" конфигурации либо находились в "основном" файле до того, как другие были вызваны, либо, если возможно, в первом вызываемом файле.