2017-08-29 69 views
0

我想做什麼 - 我有一個孩子和父類。孩子有SimpleFoo,父母需要Advaced foo。所以,Java中的CDI方法注入和bean繼承

@Dependent 
public class SimpleFoo { 
} 

@Dependent 
public class AdvancedFoo extends SimpleFoo { 
} 

@Dependent 
public class Child { 

    private SimpleFoo foo; 

    @Inject 
    protected void setFoo(SimpleFoo foo) { 
     this.foo = foo; 
    } 
} 

@Dependent 
public class Parent extends Child { 

    @Inject 
    @Override 
    protected void setFoo(SimpleFoo foo) { //How to inject here AdvancedFoo 
     super.setFoo(foo); 
    } 
} 

我知道,我可以通過構造函數注入做到這一點,但我需要方法注入。怎麼做?是否可以不使用名稱(如MyBean1)而只使用類別(AdvancedFoo)?

回答

1

使用限定符 - 您現在有兩個bean,它們都滿足您對類型的要求;您需要限制這些情況,併爲這些情況制定限定符。

這裏是如何做到這一點,首先預選賽:

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

現在,讓你的AdvancedFoo豆使用預選賽:

@Dependent 
@MyQualifier 
public class AdvancedFoo extends SimpleFoo { 
... 
} 

最後,在init方法中,注入一個bean類型SimpleFoo並帶有限定符@MyQualifier

@MyQualifier 
public class Parent extends Child { 

    @Inject 
    protected void setFoo(@MyQualifier SimpleFoo foo) { 
     this.foo = foo; 
    } 
}