2013-10-14 110 views
0

我是CDI的新手。我无法弄清楚如何使用CDI转换下面的代码。使用CDI将参数传递给bean

Class Client { 

    void method(){ 
    List<Events> events = getEvents(); 
    I b = new B(events); 
    I c = new C("Hello"); 
    } 

List<Events> getEvents(){ 
    //Do Something 
    return events; 
    } 
} 

Class B implements I{ 

List<Events> events ; 

B(List<Events> events){ 
    this.events = events; 
    } 
} 

Class C implements I{ 

String s; 
    C(String s){ 
    this.s = s; 
    } 
} 

我使用限定符以避免歧义,但可以找出如何通过从client.Do我需要使用生产者注入列表和串入分别B类和C参数?

@Qualifier 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER}) 
public @interface Ii { 
Type value() ; 
public enum Type { 
     B, 
     C 
    } 

} 


Class Client { 
    @Inject @Ii(Ii.type.B) 
    B b; 
    @Inject @Ii(Ii.type.C) 
    C b; 

} 

@Ii(Ii.type.B) 
Class B { 

} 

@Ii(Ii.type.C) 
Class C { 
} 

回答

2

您需要声明一个生产者。

@Produces @Ii(Ii.type.B) 
public void produceB { 
    return Ii.type.B; 
} 

@Produces @Ii(Ii.type.C) 
public void produceC { 
    return Ii.type.C; 
} 

为了向您事件需要标注应与@Observes创建活动参数。在下面的代码中,您可以看到如何获取激发事件的列表。

@Inject 
private List<Event> events; 
+0

但是,B类如何获得列表?产品将只返回新的B()。 – Paneri

+0

我用允许您访问事件列表的代码更新了我的答案。 –