Dependency injection 如何进行焊接以区分[@Default@Any@命名]来自[@Default@Any]?

Dependency injection 如何进行焊接以区分[@Default@Any@命名]来自[@Default@Any]?,dependency-injection,cdi,weld,Dependency Injection,Cdi,Weld,我正在使用weldse测试我的JSR-330注释类之一 @Inject HelloWorld any; @注入@Named(“impl”)HelloWorld namedAsImpl; @注入@Named(“demo”)HelloWorld namedAsDemo; @注入@Impl HelloWorld qualifiedwhimpl; @注入@Demo HelloWorld qualifiedWithDemo; 我成功地将Guice、Dagger和Dagger2注入这些区域 我准备了一个提

我正在使用
weldse
测试我的
JSR-330
注释类之一

@Inject HelloWorld any;
@注入@Named(“impl”)HelloWorld namedAsImpl;
@注入@Named(“demo”)HelloWorld namedAsDemo;
@注入@Impl HelloWorld qualifiedwhimpl;
@注入@Demo HelloWorld qualifiedWithDemo;
我成功地将Guice、Dagger和Dagger2注入这些区域

我准备了一个提供者类

@RequestScoped
公共类HelloWorldWeldProvider{
@生成HelloWorld any(){
返回当前值().nextBoolean()
?新HelloWorldImpl():新HelloWorldDemo();
}
@生成@Named(“impl”)HelloWorld namedAsImpl(){
返回新的HelloWorldImpl();
}
@生成@Named(“demo”)HelloWorld namedAsDemo(){
返回新的HelloWorldDemo();
}
@生成@Impl HelloWorld qualifiedWithImpl(){
返回新的HelloWorldImpl();
}
@生成@Demo HelloWorld qualifiedWithDemo(){
返回新的HelloWorldDemo();
}
}
和焊接投诉

WELD-001409: Ambiguous dependencies for type HelloWorld with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject ....any
  at ....any(HelloWorldDependencyInjectionTest.java:0)
  Possible dependencies: 
  - Producer Method [HelloWorld] with qualifiers [@Default @Any @Named] declared as [[BackedAnnotatedMethod] @Produces @Named ....namedAsDemo()],
  - Producer Method [HelloWorld] with qualifiers [@Default @Any @Named] declared as [[BackedAnnotatedMethod] @Produces @Named ....namedAsImpl()],
  - Producer Method [HelloWorld] with qualifiers [@Any @Default] declared as [[BackedAnnotatedMethod] @Produces ....any()]

这正常吗?或者是
CDI
DI
的工作方式不同?`

是的,这是预期的。注入点的Bean解析由Highlander原则控制:“只能有一个。”

从:

如果bean没有显式声明除
@Named
之外的限定符, bean正好有一个额外的限定符,类型为
@Default
。这 被称为默认限定符

如果注入点未声明任何限定符,则注入点只有一个限定符,即default qualifier@default

因此,您的不合格注射点确实与三豆相匹配


你的第二个问题是CDI和DI不同吗?取决于您对DI的定义。如果您的意思是DI=,那么答案是肯定的,否则创建新规范就没有意义了。

是的,这是预期的。注入点的Bean解析由Highlander原则控制:“只能有一个。”

从:

如果bean没有显式声明除
@Named
之外的限定符, bean正好有一个额外的限定符,类型为
@Default
。这 被称为默认限定符

如果注入点未声明任何限定符,则注入点只有一个限定符,即default qualifier@default

因此,您的不合格注射点确实与三豆相匹配


你的第二个问题是CDI和DI不同吗?取决于您对DI的定义。如果您的意思是DI=,那么答案是肯定的,否则创建一个新规范就没有意义了。

如果我不得不猜测,您违反了CDI规范。CDI确实利用了最佳匹配方法来满足注入点,而不是您可能在其他框架中找到的精确匹配。如果我不得不猜测,您违反了CDI规范。CDI确实利用了最佳匹配方法来满足注入点,而不是您可能在其他框架中找到的精确匹配。