Редактировать: Возможно, более краткий способ задать этот вопрос: Предоставляет ли Spring способ для меня разрешить неоднозначные кандидаты во время внедрения, предоставляя мою собственную логику слушателя / фабрики / решения?
На самом деле, возможно, что квалификатор @Environmental в поле члена ниже не нужен: если @ Inject-ion неоднозначен ... позвольте мне помочь?Фактически, @ResolveWith (EnvironmentalResolver.class) тоже будет в порядке ..
Когда Spring пытается внедрить зависимость (используя аннотации), я понимаю, что мне нужно @Qualifier в точке @Inject, если яЯ должен иметь несколько компонентов, которые реализуют этот интерфейс.
Я хотел бы сделать что-то вроде этого:
</p>
<pre><code>class MyFoo implements Foo {
@Inject
@Environmental
private Bar bar;
}
@Environmental(Environment.Production)
class ProductionBar implements Bar {
}
@Environmental({Environment.Dev, Environment.Test})
class DevAndTestBar implements Bar {
}
Я бы ожидал, что мне нужно будет создать какой-нибудь определитель неоднозначности, который бы выглядел (смутно) примерно так:
</p>
<pre><code>class EnvironmentalBeanAmbiguityResolver {
// set from configuration, read as a system environment variable, etc.
private Environment currentEnvironment;
public boolean canResolve(Object beanDefinition) {
// true if definition has the @Environmental annotation on it
}
public Object resolve(Collection<Object> beans) {
for (Object bean : beans) {
// return bean if bean @Environmental.values[] contains currentEnvironment
}
throw new RuntimeException(...);
}
}
Oneпример того, где это было бы полезно, у нас есть сервис, который связывается с конечными пользователями.Прямо сейчас у меня есть только взломанный AOP-аспект, который перед вызовом метода для «MailSender» проверяет флаг среды «Production» и, если он не установлен, отправляет нам электронное письмо вместо электронного письма пользователя.Я хотел бы вместо того, чтобы обернуть это в аспект AOP, специфичный для отправки почты, вместо этого иметь возможность дифференцировать сервисы на основе текущей среды. Иногда это просто вопрос «производства» или «не производства», как я продемонстрировал выше,но определение для каждой среды тоже работает.
Я думаю, что это можно повторно использовать и для региона ... например, @Regional и @Regional (Region.UnitedStates) и т. д. и т. д.
Я бы подумал, что @Environmental на самом деле был бы @Qualifier таким образом, если бы вы хотели напрямую зависеть от того, что вы могли бы сделать (бин @Environmental (Production), вероятно, напрямую зависел бы от соавтора @Environmental (Production) - так что никакой двусмысленностидля предметов более низкого уровня --- то же самое для @Regional (US) будет зависеть от других @Regional (US) товары явно и обойдут мой пока непонятный BeanAmbiguityResolver)
Спасибо.