使用 @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 处解析注释来完成此操作。
您将不得不以编程方式实例化实现,但这是一个解决方案。
我正在寻找一种动态查找由注释列表注释的 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 处解析注释来完成此操作。 您将不得不以编程方式实例化实现,但这是一个解决方案。