@Inject 在 class 类型上带有自定义限定符注释的实例

@Inject Instance with custom quailfier annotation on class type

假设我们有

class TestClass1 {  

@Inject @Any @BBB(PARAM1)  
Instance< Product > instaces;

@Produces @BBB(PARAM1)  
Product first(){...}

@Produces @BBB(PARAM1)  
Product second(){...}    
}

class TestClass2 {  

@Inject @Any @BBB(PARAM2)  
Instance< Product > instaces;

@Produces @BBB(PARAM2)  
Product first(){...}

@Produces @BBB(PARAM2)  
Product second(){...}    
}

当我将@BBBs 放在class 上并从方法实例中删除时,实例为空。它是如何工作的,我必须在每个@Produces 方法或我错过的东西上复制@BBB?

@BBB 使用@Qualifier 和 RUNTIME 保留注释

不确定我是否完全理解你的问题,但我希望这能澄清问题。我认为你把几样东西混在一起了。

1) 制作人

这些 methods/fields 是 有效地被认为是 beans!这意味着在生产者之上,您必须定义它将创建什么样的 bean。归结为 qualifiersscopestereotypes、...无论你 need/want那里。这也允许您拥有多个生产者,这些生产者仅在创建 bean 的限定符方面有所不同。 所以是的,你需要在每个制作人身上重复一遍,因为它可能会有很大的不同。

2) 你的 classes

你本身就是 beans(在这种情况下是从属范围),你可以在它们上面指定所有 CDI 内容 - 范围、限定符等。这将 不会 传播到生产者在豆子里面。如果您考虑一下,那就意味着如果您的 class 是应用程序范围的,那么它产生的任何内容也将是应用程序范围的,事实并非如此。

您的混淆来源也可能是 interceptor/decorator(或者更确切地说是它们的绑定),它可以放在 bean 方法上(为给定方法启用拦截)或放在整个 class 之上(启用所有 方法的拦截)。