使用 @Qualifier 列表的 CDI 编程查找

CDI Programmatic lookup with a list of @Qualifier

我正在寻找一种动态查找由注释列表注释的 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*/
}

在我以前的应用程序版本中,我使用了没有配置文件数组的相同注释,并在实现中创建了一个 @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*/
}

谢谢!

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

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