Можно ли использовать несколько аннотаций @Qualifier в Spring? - PullRequest
3 голосов
/ 18 августа 2010

У меня есть набор бобов, которые характеризуются двумя свойствами. Они в основном сериализаторы для разных классов и для разных целей.

Например, может быть сериализатор Order для локального журнала, сериализатор Order для регистрации вызовов веб-службы, сериализатор Customer для отслеживания URL и Customer сериализатор для отслеживания URL.

Вот почему я хотел бы использовать две @Qualifier аннотации, подобные этой:

@Autowired
@Qualifier("order")
@Qualifier("url")
private Serializer<Order> orderSerializer;

К сожалению, компилятор жалуется на дубликаты аннотаций в этом случае. Есть ли обходные пути или альтернативные решения этой проблемы?

Ответы [ 3 ]

11 голосов
/ 04 июня 2014

Я понимаю, что этот вопрос довольно старый, но это то, что вы должны быть в состоянии выполнить с весны 2.5.

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

Рассмотрим эти два типа аннотаций, названных аналогично вашему примеру:

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface MyOrderQualifier {
}

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface MyUrlQualifier {
}

Вы должны иметь возможность использовать обе эти аннотации в своей области, поскольку они являются независимыми аннотациями.

@Autowired
@MyOrderQualifier
@MyUrlQualifier
private Serializer<Order> orderSerializer;

Вот ссылка на справочную документацию Spring 2.5 , объясняющую этот процесс. Обратите внимание, что это для Spring 2.5 и может быть устаревшим по отношению к более свежим версиям Spring.

4 голосов
/ 18 августа 2010
@Qualifier("order-url")

и соответственно назовите свой компонент order-url

@Component("order-url")
0 голосов
/ 19 августа 2010

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

Или, я согласен с Божо здесь, вы можете использовать некоторые соглашения о именах в своих bean-компонентах Spring, чтобы имя бина могло отражать его ответственность и область применения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...