简体   繁体   English

Java中的CDI方法注入和Bean继承

[英]CDI method injection and bean inheritance in Java

What I want to do - I have a child and parent class. 我想做的-我有一个孩子和一个父母班。 Child has SimpleFoo, Parent needs Advaced foo. 孩子有SimpleFoo,父母需要Advaced foo。 So, 所以,

@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);
    }
}

I know that I can do it via constructor injection but I need method injection. 我知道我可以通过构造函数注入来实现,但是我需要方法注入。 How to do it? 怎么做? Can it be done without using names (like MyBean1 ) but only using classes ( AdvancedFoo )? 是否可以不使用名称(例如MyBean1 )而仅使用类( AdvancedFoo )来完成?

Use qualifiers - you now have two beans which both fulfill your requirements on type; 使用限定符-您现在拥有两个都符合类型要求的bean; you need to limit that and qualifiers are made for such cases. 您需要对此进行限制,并且限定词是针对此类情况的。

Here is how to do it, first the qualifier: 首先是预选赛:

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

Now, make your AdvancedFoo bean use that qualifier: 现在,让您的AdvancedFoo bean使用该限定符:

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

And finally, in the init method, inject a bean of type SimpleFoo and with qualifier @MyQualifier : 最后,在init方法中,注入类型为SimpleFoo并带有限定符@MyQualifier

@MyQualifier
public class Parent extends Child {

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM