首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使Weld区分[“默认”、“任何”、“命名”和“默认”?

如何使Weld区分[“默认”、“任何”、“命名”和“默认”?
EN

Stack Overflow用户
提问于 2015-11-29 01:31:00
回答 1查看 1.8K关注 0票数 0

我正在使用weld-se测试我的一个JSR-330注释类。

代码语言:javascript
复制
@Inject HelloWorld any;
@Inject @Named("impl") HelloWorld namedAsImpl;
@Inject @Named("demo") HelloWorld namedAsDemo;
@Inject @Impl HelloWorld qualifiedWithImpl;
@Inject @Demo HelloWorld qualifiedWithDemo;

我成功地给这些领域注入了Guice,Dagger和Dagger2。

我准备了一个提供者类。

代码语言:javascript
复制
@RequestScoped
public class HelloWorldWeldProvider {

    @Produces HelloWorld any() {
        return current().nextBoolean()
               ? new HelloWorldImpl() : new HelloWorldDemo();
    }

    @Produces @Named("impl") HelloWorld namedAsImpl() {
        return new HelloWorldImpl();
    }

    @Produces @Named("demo") HelloWorld namedAsDemo() {
        return new HelloWorldDemo();
    }

    @Produces @Impl HelloWorld qualifiedWithImpl() {
        return new HelloWorldImpl();
    }

    @Produces @Demo HelloWorld qualifiedWithDemo() {
        return new HelloWorldDemo();
    }
}

焊接抱怨

代码语言:javascript
复制
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不同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-29 17:37:01

是的,这是意料之中的。注入点的Bean解析是由Highlander原理决定的:“只能有一个。”

来自CDI规范

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

如果注入点没有声明限定符,则注入点正好有一个限定符,默认限定符@Default。

因此,你的不合格注射点确实是匹配的三个豆子。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33978443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档