2011-11-02 3 views
1

У меня есть класс структуры вдоль этих линий:Использование Spring для введения различных экземпляров класса на основе экземпляра иерархии

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

    //... 
} 

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

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

org.slf4j.LoggerFactory.getLogger(workerName) 

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

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

    //... 
} 

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

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

+0

Вы также можете использовать ['LoggerFactory.getLogger (Worker.class);'] (http://slf4j.org/api/org/slf4j/LoggerFactory.html) –

+0

@ JohanSjöberg: несколько экземпляров Worker (с разными имена) в этом сценарии будет использовать один и тот же Logger. Если это не было требованием, мы могли бы использовать такое решение: http://jgeeks.blogspot.com/2008/10/auto-injection-of-logger-into-spring.html –

ответ

0

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

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

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

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

0

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