2016-02-27 22 views
0

我正在尋找一種動態查找由註釋列表註釋的CDI bean的方法。 有沒有一種優雅的方式來查找包含至少一個值的bean?CDI編程查找與@Qualifier列表

這是我的註解:

@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

您可以使用@Produces和解析注入點上的註釋來完成此操作。 您將不得不以編程方式實例化實現,但它是一個解決方案。

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

+0

好主意謝謝! –

+0

嗯......我使用動態查找這些bean,我不能使用.getAnnoted()方法,但我想我可以使用.getQualifiers()。我會很快發佈我的解決方案。 –