2014-10-05 58 views
0

我是新來的語境依賴於注射的Java EE(我是EE 6),我想請詢問有關的東西我跑進:語境依賴Inhections在Java EE中

比方說,你聲明此註解:

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD }) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Qualifier 
public @interface MaxPassengers {} 

在一個不同的I類說,getMaxPassengers方法產生的值時,@MaxPassengers註解用於注入:

public class AirplaneInformation implements Serializable { 
    @Produces @MaxPassengers Integer getMaxPassengers() { 
     return 250; 
    } 
} 

在第三個類,我注入@MaxPassengers到一個變量:

@MaxPassengers 
@Inject 
private Integer maxPassengers; 

所有這些工作都是偉大的,但這裏的扭曲:

如果我想改變的 簽名@Produces @MaxPassengers整數getMaxPassengers()@Produces @MaxPassengers整數getMaxPassengers(字符串planeType)

並根據planeType返回動態值maxPassengers

我不知道是否可以做到這一點,如果是這樣,我怎麼更改以下註解

@MaxPassengers 
@Inject 
private Integer maxPassengers; 

還提供planeType說法。

感謝你的幫助, -Daniel

回答

1

的方式這樣做是對planeType添加到預選賽@NonBinding。這樣,你會在InjectionPoint對象傳遞給你的方法,並期待在MaxPassengers這樣:injectionPoint.getAnnotated().getAnnotation(MaxPassengers.class);

如果你想在運行時拉這件事,你可以使用一個Instance對象的MaxPassengers的一個AnnotationLiteral,這樣的事情:

@Inject @Any 
private Instance<Integer> integerInstance; 


... 

integerInstance.select(new MaxPassengersLiteral("foo")).get(); 
+0

出於好奇:是否需要'@ Any'或者只需要注入'@ MaxPassengers'就可以提高速度? – 2014-10-05 09:27:57

+0

由於注射點不知道要注入什麼,因此需要「任何」。 – 2014-10-05 13:11:52

+0

謝謝你的回答約翰。我的感覺是你是Java EE的真正專家。說實話,在我完全理解你的意思之前,我必須學習更多的CDI。我從「Java EE 6教程基本概念」一書中學到了關於CDI的所有知識,然後提出了航空公司小概念驗證項目。本週我將閱讀「Beginning EJB 3」中的CDI章節,然後希望我會多瞭解一些...... – Daniel 2014-10-06 22:01:19