【发布时间】:2011-09-22 17:02:07
【问题描述】:
编辑: 也许问这个问题的更简洁的方法是:Spring 是否提供了一种方法,让我通过提供我自己的侦听器/工厂/决策逻辑在注入时解决模棱两可的候选者?
事实上,可以说下面成员字段上的@Environmental 限定符是不必要的:如果@Inject-ion 不明确......让我帮忙?事实上,@ResolveWith(EnvironmentalResolver.class) 也可以..
当 Spring 尝试注入依赖项(使用注释)时,我知道如果我要拥有多个实现该接口的组件,我需要 @Qualifier 一个 @Inject 点。
我想做的是这样的:
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 {
}
我希望我需要创建某种歧义解析器,它看起来(模糊地)像这样:
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(...);
}
}
这很有用的一个例子是我们有一个联系最终用户的服务。现在我只有一个被破解的 AOP 方面,在调用“MailSender”的方法之前,检查“生产”环境标志,如果没有设置,它会向我们发送电子邮件而不是用户电子邮件。我我不想将其包装在特定于邮件发送的 AOP 方面,而是能够根据当前环境区分服务。有时这只是“生产”或“非生产”的问题,正如我在上面所展示的,但是每个环境的定义也可以。
我认为这也可以在区域中重复使用...例如@Regional 和 @Regional(Region.UnitedStates) 等等。
我想@Environmental 实际上是一个@Qualifier,如果你想直接依赖于你可以的环境(@Environmental(Production) bean 可能直接依赖于@Environmental(Production) 协作者 - 所以对于较低级别的项目没有歧义 --- 相同的 @Regional(US) 项目将明确依赖于其他 @Regional(US) 项目,并且会绕过我尚未理解的 BeanAmbiguityResolver)
谢谢。
【问题讨论】:
标签: spring dependency-injection qualifiers