我想做什么-我有一个孩子和一个父母班。孩子有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;
}
}