2013-04-16 3 views
1

J'ai 3 implémentations d'une interface, et pour instancier l'un d'entre eux j'ai besoin de vérifier un paramètre de la base de données. Je prévoyais de le faire avec le modèle d'usine, mais puisque j'utilise injection JSF 2 dépendance dans le reste de mon application, je me demandais si il ya un moyen de faire cela, est-il possible de faire l'injection de dépendance dinamiquement? Puis-je indiquer d'une manière ou d'une autre une méthode ou quelque chose pour prendre la bonne implémentation à chaque instant? Pour le backend j'utilise le noyau de ressort, donc un moyen de le faire avec le contexte de printemps fonctionnerait.Injection de dépendance dynamique dans jsf 2 ou ressort 3

J'utilise des annotations pour tout (@Autowired pour le printemps, @ManagedProperty pour JSF).

EDIT: Le projet sera déployé sur un serveur Tomcat.

Répondre

1

Je vous suggère d'utiliser CDI dans votre projet JSF, vous pouvez ensuite utiliser l'injection programmée. Vous devez commencer par ajouter des qualificatifs CDI à vos implémentations d'interface (vous créerez essentiellement des annotations personnalisées pour chaque implémentation - tutorial). Ensuite, vous pouvez utiliser quelque chose comme

@Named //similar to ManagedBean 
@RequestScoped 
public Bean { 

    @Inject 
    @Any 
    Instance<YourInterface> yourInterface; 

    public void someMethod() { 
     if(someCondition) { 
      InterfaceImpl impl = yourInterface.select(new SomeOfYourQualifiers()).get(); 
     } 
    }  
} 

Source

vous ne vous avez pas à utiliser Autowired en faveur de Inject. Je suis sûr qu'il ya une certaine façon de printemps comment à cela, mais je vais laisser cela à certains experts de printemps ici :-)

EDIT

Selon cette answer est vraiment possible d'exécuter CDI sur Tomcat . Vous trouverez également des tutoriels comme celui-ci: one. Et l'approche du printemps pourrait utiliser AutowireCapableBeanFactor mais comme je le dis, je ne sais pas le printemps beaucoup, donc c'est juste un gues sauvages :-)

+1

Merci pour la réponse! Je ne peux pas cependant utiliser CDI, nous ne sommes autorisés à utiliser Tomcat 6, et autant que je sache, il ne supporte pas CDI :(. – parranz

+0

Voir mon edit s'il vous plaît –

+0

Salut, ne peut toujours pas le changer en CDI, le le projet est déjà trop gros et nous n'avons pas assez de temps :(.Je vais attendre et voir s'il y a un moyen de le faire avec javax.faces.bean et si ce n'est pas le cas je vais essayer AutowireCapableBeanFactory, il semble vraiment comme ce dont nous avons besoin, merci beaucoup !! – parranz