首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java EE中的@Producer注释

Java EE中的@Producer注释
EN

Stack Overflow用户
提问于 2014-09-12 04:37:33
回答 2查看 3.5K关注 0票数 1

我正在学习Java、依赖注入,特别是@Produces。我想知道为什么在getGreedingCard()方法中,它需要一个@Produces注释,因为GreetingCardImplAnotherGreetingCardImpl两个类已经导入到了空间中。这就像常规的包/类依赖关系一样,一个简单的导入解决了这个问题。为什么它需要通过@producer注释进行依赖注入?

谢谢你提前解释。

代码语言:javascript
复制
public interface GreetingCard {
    void sayHello();
}


public class GreetingCardImpl implements GreetingCard {

    public void sayHello() {
        System.out.println("Hello!!!");
    }
}


public class AnotherGreetingCardImpl implements GreetingCard {

    public void sayHello() {
        System.out.println("Have a nice day!!!");
    }
}

import com.javacodegeeks.snippets.enterprise.cdibeans.impl.AnotherGreetingCardImpl;
import com.javacodegeeks.snippets.enterprise.cdibeans.impl.GreetingCardImpl;

@SessionScoped
public class GreetingCardFactory implements Serializable {

    private GreetingType greetingType;

    @Produces
    public GreetingCard getGreetingCard() {
        switch (greetingType) {
            case HELLO:
                return new GreetingCardImpl();
            case ANOTHER_HI:
                return new AnotherGreetingCardImpl();
            default:
                return new GreetingCardImpl();
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-12 04:54:29

我想知道为什么在getGreedingCard()方法中,它需要一个@Produces注释,因为GreetingCardImpl和AnotherGreetingCardImpl两个类已经导入到了空间中。

嗯,并不是getGreetingCard需要@Produces注释。关键是使其他类能够通过依赖项注入接收GreetingCards。

代码语言:javascript
复制
public class Foo {

@Inject // <--- will invoke @Producer method
GreetingCard foosGreetingCard

...

}

有关更多细节,请参见这里

生产者方法是充当bean实例源的方法。方法声明本身描述bean,当指定的上下文中不存在实例时,容器调用该方法来获取bean的实例。

票数 1
EN

Stack Overflow用户

发布于 2014-09-12 08:51:05

在您的示例中,它不需要@Produces,因为您将注入工厂bean并使用其方法直接创建实例,而不是注入greetingCard bean。

代码语言:javascript
复制
@Inject
GreetingCardFactory factory;

...

GreetingCard card = factory.getGreetingCard();

如果将其定义为@Produces方法,并尝试注入GreetingCard,那么您将得到我在注释中描述的异常。

但是,如果要另外创建限定符,如下所示:

代码语言:javascript
复制
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
public @interface ProducedCard {}

并将其添加到producer方法中:

代码语言:javascript
复制
@Produces @ProducedCard 
public GreetingCard getGreetingCard() {
...

然后,您就可以使用如下的生产者方法只注入GreetingCard bean:

代码语言:javascript
复制
@Inject @ProducedCard
GreetingCard card;

由于现在没有歧义,因为只有一个地方可以创建标记为@ProducedCard的贺卡:-)

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

https://stackoverflow.com/questions/25800828

复制
相关文章

相似问题

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