Java

时间:2017-08-29 11:30:42

标签: java java-ee dependency-injection cdi

我想做什么 - 我有一个孩子和父母班级。孩子有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)吗?

1 个答案:

答案 0 :(得分:1)

使用限定符 - 您现在有两个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;
    }
}