Весна: убедитесь, что конкретный бит сначала инициализируется

У меня есть библиотека, выполняющая установку и настройку времени выполнения log4j (нет log4j.properties или log4j.xml). Я определил bean-компонент с classом MyLoggerFactory, и я хочу, чтобы это был первый компонент, который должен быть инициализирован с использованием пружины. Я видел, что проблема уже была подана с весной, чтобы поддержать порядок инициализации, но мне было интересно, есть ли способ отметить компонент в качестве первого компонента, который будет инициализирован весенним контейнером?

Ваши варианты:

  1. Используйте аннотацию @DependsOn (доступную после Spring 3.0.x) или зависимую depends-on xml-атрибута и сделайте все classы, которые используют настроенные журналы, зависят от фабрики журналов
  2. Сделайте фабрику фактической фабрикой для лесорубов и введете регистраторы в бобы вместо прямого вызова фабрики – это по сути то же самое, что и вариант 1, за исключением того, что подразумевается зависимость. Это вариант, который я бы рекомендовал.
  3. Переместите код инициализации в часть вашего кода, где указан порядок вызова – метод main() , или ServletContextListener зарегистрированный до того, который инициализирует Spring.

Невозможно явно определить порядок инициализации весной и, вероятно, никогда не будет – нет способа определить полезную семантику для него, учитывая, что вы можете загружать многие файлы конфигурации контекста приложения, которые могут иметь конфликтующие упорядочения. Я еще не видел случая, когда желаемый заказ не мог быть достигнут путем рефакторинга вашего кода, чтобы лучше соответствовать шаблону инъекции зависимостей.

Вы можете @Autowired @Configuration в главной @Configuration

 @Configuration @Import(BusinessConfig.class, EarlyBeans.class) public class MainConfiguration { // The bean defined in EarlyBean will be loaded before // most beans references by MainConfiguration, // including those coming from BusinessConfig @Autowired EarlyBean earlyBean; } @Configuration public class EarlyBeans { @Bean public Void earlyBean(ApplicationContext appContext) { // .getBeansOfType allows to call for beans which might not exist appContext.getBeansOfType(TechnicalBean.class); return null; } } 

Это запрошенная функция, но не разрешена. Вы можете использовать зависящий, но слишком многословный. Перейдите по ссылке tis для получения дополнительной информации: https://jira.springsource.org/browse/SPR-3948

Вы можете разделить контекст вашего приложения на несколько и использовать импорт в основном контексте приложения. Сначала вы можете поместить основные параметры среды в порядке импорта, а затем продолжить добавлять другие файлы.

Это может быть как внизу.

     
Interesting Posts
Давайте будем гением компьютера.