我正在寻找一种方法来动态查找由注释列表注释的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*/
}
谢谢!
答案 0 :(得分:1)
您可以使用@Produces并在InjectionPoint处解析注释来完成此操作。 您必须以编程方式实例化实现,但它是一个解决方案。