Динамическое определение компонента для автоматического подключения в Spring (с использованием квалификаторов)

У меня есть приложение Java EE + Spring, которое предпочитает аннотации конфигурации XML. У bean-компонентов всегда есть прототип.

В моем приложении теперь есть бизнес-правила, которые зависят от страны, из которой был сделан запрос пользователя. Итак, у меня было бы что-то вроде этого (имейте в виду, что этот пример был сильно упрощен):

@Component
public class TransactionService {
    @Autowired
    private TransactionRules rules;
    //..
}


@Component
@Qualifier("US")
public class TransactionRulesForUS implements TransactionRules {
     //..
}

@Component
@Qualifier("CANADA")
public class TransactionRulesForCanada implements TransactionRules {
     //..
}

Я искал способ заставить механизм автоматического подключения автоматически вводить правильный bean-компонент (в данном примере из США или Канады) на основе по стране текущего запроса. Страна будет храниться в переменной ThreadLocal и будет меняться при каждом запросе. Также будет глобальный класс для всех стран, у которых нет своих особых правил.

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

  1. Прежде чем Spring создаст экземпляр объекта, нужно было вызвать мой собственный код.
  2. Если я обнаружил, что запрашиваемый интерфейс имеет несколько реализаций, я бы посмотрел в моей переменной ThreadLocal нужную страну и динамически добавил бы соответствующий квалификатор в запрос автоматического подключения.
  3. После этого Весна творила все свое обычное волшебство. Если был добавлен квалификатор, это необходимо было принять во внимание; в противном случае поток будет продолжаться как обычно.

На правильном ли я пути? Есть у меня идеи по этому поводу?

Спасибо.

8
задан zleand 11 October 2011 в 01:23
поделиться