我想做什么-我有一个孩子和一个父母班。孩子有SimpleFoo,父母需要Advaced foo。所以,

@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)来完成?

最佳答案

使用限定符-您现在拥有两个都符合类型要求的bean;您需要对此进行限制,并且限定词是针对此类情况的。

首先是预选赛:

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


现在,使您的AdvancedFoo bean使用该限定符:

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


最后,在init方法中,注入类型为SimpleFoo并带有限定符@MyQualifier的bean:

@MyQualifier
public class Parent extends Child {

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

10-07 17:13