使用@Qualifier列表进行CDI编程查找

时间:2016-02-27 09:29:08

标签: java-ee cdi

我正在寻找一种方法来动态查找由注释列表注释的CDI bean。 有没有一种优雅的方法来查找包含至少一个值的bean?

这是我的注释:

@Qualifier
@Retention(RUNTIME)
@Target({ METHOD, FIELD, PARAMETER, TYPE })
public @interface SelectEngine {

    ProfilUser profil();

    Periodicite periodicite();

    int annee();

    @Qualifier
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
    @Retention(RetentionPolicy.RUNTIME)
    @interface List {

        SelectEngine[] values();
    }
}

这是一个实现示例:

@SelectEngine.List({
            @SelectEngine(profil = ProfilUser.CAS, annee = 2016, periodicite = Periodicite.MENSUELLE),
            @SelectEngine(profil = ProfilUser.COMMERCIAL, annee = 2016, periodicite = Periodicite.MENSUELLE)
})
public class MoteurPMCOM2016 implements MoteurPrime<RapportPrimeMensuelle> {
    /*implementation*/
}

在我之前的应用版本中,我使用了相同的注释而没有profil数组,并在实现中创建一个@Produces方法,如下所示:

@Qualifier
@Retention(RUNTIME)
@Target({ METHOD, FIELD, PARAMETER, TYPE })
public @interface SelectEngine {

        ProfilUser profil();
        Periodicite periodicite();
        int annee();
}

//The CDI bean implementation    
@SelectEngine(profil = ProfilUser.COMMERCIAL, annee = 2016, periodicite = Periodicite.MENSUELLE)
public class MoteurPMCOM2016 implements MoteurPrime<RapportPrimeMensuelle> {

        //For profil = ProfilUser.CAS I use the same implementation
        @Produces
        @SelectEngine(profil = ProfilUser.CAS, annee = 2016, periodicite = Periodicite.MENSUELLE)
        public MoteurPrime<RapportPrimeMensuelle> forCASProfil( @SelectEngine(profil = ProfilUser.COMMERCIAL, annee = 2016, periodicite = Periodicite.MENSUELLE) engine) {
          return engine;
        }
/*implementation*/
}

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用@Produces并在InjectionPoint处解析注释来完成此操作。 您必须以编程方式实例化实现,但它是一个解决方案。

示例:https://martinsdeveloperworld.wordpress.com/2014/02/23/injecting-configuration-values-using-cdis-injectionpoint/