Dependency Injection mit @Inject in Weld (JSR-299 RI). Wie wird die entsprechende @Produces gefunden?
-
24-09-2019 - |
Frage
Ich habe mit der JSR-299 Referenzimplementierung „Weld“ mit dem Zweck der Verwendung in einer Stand-alone-Anwendung gespielt, und ich habe einen Blick auf der Dokumentation hat, und an der Magie verwunderte.
Meine Frage ist wie der Hersteller eines bestimmten Objekts @ Inject'ed zu finden ist?
Entweder der Java-Compiler erzeugt Hinweise für Anmerkungen, die leicht durch den Klassenlader gefunden wird, oder die komplette Classpath muss laden alle Klassen durchlaufen werden, um zu sehen, was sie tun, was mir sehr ineffizient klingt, oder es ist ein völlig anderer Ansatz.
Was ist der Trick?
Lösung
Der Classpath ist für "bean-Archive" gescannt. Bean Archive sind die Bibliotheken, die META-INF/beans.xml
enthalten. Alle Bohnen in diesen Archiven werden automatisch mit dem BeanManager
registriert und ihre Anmerkungen werden analysiert und gespeichert. Jedes Mal, wenn ein Hersteller benötigt wird, der Bean-Manager wird über qualifizierte Hersteller konsultiert
Andere Tipps
Ich gehe davon aus, dass es das gleiche ist wie in Seam funktioniert: in dem der Classpath tatsächlich abgetastet wird. Die impl wird auch mit dem kleinsten passenden Rahmen für die @produce suchen, so können Sie zum Beispiel ein Erzeugnis auf Sitzungsebene für eingeloggte Benutzer und eine andere auf Anwendungsebene für anonyme Benutzer haben können.
Keine Ahnung, aber das @Inject teilweise durch Hibernate Vater getan wurde schließlich überarbeitet / am Ende von Springsource und Google beeinflusste. Vielleicht funktioniert es ein bisschen wie Guice?