gpt4 book ai didi

jakarta-ee - 需要注入(inject)@Qualifier

转载 作者:行者123 更新时间:2023-12-03 16:30:25 25 4
gpt4 key购买 nike

是否需要@Qualifier 注释?我们不能只注入(inject)一个特定类型的实例吗?这似乎有点额外的工作,因为我们必须为每个实现类创建注释类型。为了说明我的意思,下面是示例:

@Documented
@Retention(RUNTIME)
@Qualifier
public @interface AppleQ { }

@Documented
@Retention(RUNTIME)
@Qualifier
public @interface CheeseQ { }

public interface Eatable { }

@AppleQ
public class Apple implements Eatable { }

@CheeseQ
public class Cheese implements Eatable { }

public class Breakfast {
@Inject @AppleQ Eatable somethingToEat;
}

对比

public interface Eatable { }

public class Apple implements Eatable { }

public class Cheese implements Eatable { }

public class Breakfast {
@Inject Apple somethingToEat;
}

最佳答案

您(有点)是对的,您的示例无需限定符即可运行。但与其说你不需要限定符,不如说你的例子有点误导。

一般来说,只要您有多个符合注入(inject)条件的特定类型的托管 bean,您就需要限定符。在您的示例中不是这种情况,但如果您像这样编写代码,则很容易出现这种情况:

public class Breakfast {
@Inject Eatable somethingToEat;
}

(出于与通常编写 List list = new ArrayList() 相同的原因,这使您以后可以灵活地更改实现)

如果您只有一个符合注入(inject)条件的特定类型的托管 bean,您将不需要限定符。

您想要使用限定符的更严肃的示例如下所示:

假设您希望在您的系统中有一个 Locale 类。使用不同的限定符(连同不同的生产者方法)将允许您编写如下代码:

...
@Inject
@DefaultLocale
Locale theDefaultLocale;
...
@Inject
@StandardLocale
Locale theStandardLocale;
...
@Inject
Instance<Locale> allLocales;
...

总而言之:当且仅当您拥有一个以上类型的 bean 时,您才需要限定符。这使得限定符对于绝大多数 bean 来说都是多余的——但你肯定会需要它们。

所有这些以及更多内容最好阅读 here .

关于jakarta-ee - 需要注入(inject)@Qualifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7366589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com