Использование Spring для внедрения различных экземпляров класса на основе иерархии создания - PullRequest
1 голос
/ 03 ноября 2011

У меня есть структура классов по этим направлениям:

public class Worker {
    private Parser parser;
    private Validator validator;
    private Feeder feeder;

    //...
}

Parser, Validator и Feeder - это все интерфейсы с различными классами реализации. Эти поля создаются в контексте создания Worker и не распределяются между работниками.

Что-то, что я хочу сделать, - это иметь один экземпляр org.slf4j.Logger для каждого Worker, который затем будет использоваться синтаксическим анализатором, валидатором и фидером по мере необходимости. По сути, при создании экземпляра мы хотим дать Рабочему имя, а затем все журналы используют это имя, например так:

org.slf4j.LoggerFactory.getLogger(workerName)

В идеале я хотел бы найти решение по этим направлениям:

public class XmlParser implements Parser {
    @Autowired
    private Logger logger;

    //...
}

А затем настройте функцию автоматического подключения Spring Framework на использование одного и того же экземпляра Logger во всех объектах, принадлежащих одному и тому же Worker. Разные работники должны получать разные экземпляры Logger, очевидно. Принуждение всех трех интерфейсов Parser, Validator и Feeder к указанию метода типа setLogger() кажется, по меньшей мере, не элегантным.

Как я мог выполнить эту задачу, используя какое-нибудь умное решение для внедрения зависимостей?

Ответы [ 2 ]

0 голосов
/ 04 ноября 2011

Попробуйте установить значение MDC для своего работника.Если ваша цель состоит в том, чтобы дифференцировать журналы, генерируемые различными маркерами, тогда установки MDC может быть достаточно.Если вы хотите, чтобы журналы, сгенерированные разными работниками, помещались в разные файлы, посмотрите SiftingAppender и MDCBasedDiscriminator.

0 голосов
/ 03 ноября 2011

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

final static Logger logger = LoggerFactory.getLogger("workerName");

, а затем ваш рабочий установит этот регистратор вразные компоненты.Если Spring внедряет ваши компоненты, попросите вашего работника реализовать InitializingBean и установить для регистратора значение afterPropertiesSet () .

Если вы действительно хотите сделать это более динамично,взгляните на этот пример , где BeanPostProcessor и отражение используются для внедрения правильного регистратора.

...