2010-04-04 2 views
2

J'ai joué avec l'implémentation de référence JSR-299 "Weld" dans le but de l'utiliser dans une application autonome, et j'ai regardé la documentation, et j'ai été émerveillé par la magie.Injection de dépendances avec @Inject dans Weld (JSR-299 RI). Comment est trouvé le @Produces correspondant?

Ma question est comment le producteur d'un objet donné à être injecté est trouvé? Soit le compilateur java produit des indices pour les annotations qui sont facilement trouvés par le chargeur de classe, soit le chemin de classe complet doit être parcouru en chargeant toutes les classes pour voir ce qu'ils font qui me semble très inefficace, ou c'est une approche complètement différente.

Quel est le truc?

Répondre

4

Le chemin de classe est analysé pour les "archives du bean". Les archives Bean sont les bibliothèques qui contiennent META-INF/beans.xml. Tous les beans de ces archives sont automatiquement enregistrés avec le BeanManager et leurs annotations sont analysées et stockées. Chaque fois qu'un producteur est nécessaire, le gestionnaire de beans est consulté sur les producteurs éligibles

0

Je suppose que cela fonctionne comme dans Seam: dans lequel le chemin de classe est en effet analysé. L'impl recherche également le @produce avec la plus petite portée correspondante, de sorte que vous pouvez avoir par exemple un produit au niveau de la session pour les utilisateurs connectés et un autre au niveau de l'application pour les utilisateurs anonymes.

0

Dunno, mais ce @Inject partiellement fait par le père de Hibernate a finalement été retravaillé/influencé à la fin par SpringSource et Google. Peut-être que ça fonctionne un peu comme Guice?

+0

l'annotation '@ Inject' elle-même a été spécifiée par une équipe formée par les membres de Guice et Spring. C'est une partie d'un autre JSR. – Bozho

Questions connexes