Каковы доступные варианты получения bean-компонентов, управляемых Spring, в приложении Log4J в веб-приложении, управляемом Spring? - PullRequest
3 голосов
/ 13 ноября 2009

У моего текущего лидера по сборке есть отличная идея в теории - создать пользовательское приложение Log4J, которое принимает компоненты, управляемые Spring, и использует их для регистрации ошибок в различных других источниках, кроме стандартного файла журнала. Однако, кроме создания синглтона, инициализированного при запуске, с контекстом приложения (всего за несколько секунд), я не могу думать о каких-либо других вариантах получения управляемого бина Spring в приложении Log4J.

public class SpringSingleton implements ApplicationContextAware {
    private static ApplicationContext context;
    public SpringSingleton() {
        super();
    }
    public static ApplicationContext getContext() {
        return SpringSingleton.context;
    }
    public void setApplicationContext(ApplicationContext context) {
        if(SpringSingleton.context != null) {
            throw new IllegalStateException("Context is already set!");
        }
        SpringSingleton.context = context;
    }
}

В идеале эти свойства могут быть установлены точно так же, как бины в Spring, путем внедрения зависимостей - ссылки на бины никогда не изменятся, независимо от того, сколько добавляется инициализаторов. Есть идеи?

Ответы [ 2 ]

7 голосов
/ 13 ноября 2009

У вас будет проблема boostrap, поскольку log4j должен быть инициализирован до Spring. Независимо от того, используете ли вы пользовательскую конфигурацию или стандартный инициализатор Log4j, он должен быть включен, прежде чем контекст приложения будет.

Теперь, теоретически, вы можете заставить свои пользовательские приложения «лениво» инициализировать себя (либо с помощью подхода, который вы предложили выше, либо путем создания самих приложений «полу» синглетонов - например, класс приложения имеет статическое поле экземпляра, которое заполняется afterPropertiesSet() метод; таким образом, вы можете создать самого appender в виде bean-компонента внутри Spring), но он выглядит несколько грязным и непоследовательным.

Другой подход заключается в динамической реконфигурации Log4j после инициализации контекста Spring; например написать слушатель , чтобы поймать ContextStartedEvent, получить все компоненты типа Appender из контекста и добавить их в конфигурацию Log4j. Это также позволит вам создавать свои дополнения в виде bean-компонентов, но несколько избегать одиночного беспорядка.

0 голосов
/ 02 июня 2015

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

log4j - Доступ к пружинному бобу из класса регистрирующего приложения

...