Spring: убедитесь, что конкретный компонент инициализируется первым - PullRequest
48 голосов
/ 23 октября 2011

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

Ответы [ 4 ]

41 голосов
/ 23 октября 2011

Возможны следующие варианты:

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

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

12 голосов
/ 28 февраля 2014

Вы можете @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;
    }

}
3 голосов
/ 23 октября 2011

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

1 голос
/ 04 марта 2016

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

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

<!-- Import environment properties settings. -->
<import resource="Spring-Env.xml"/>
<!-- Import All the other Application contexts. -->
<import resource="Spring-MainApplicationContext.xml"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...