2016-04-30 16 views
0

Soweit ich weiß, CDI verwendet dynamischen Proxy für nicht-abhängige Bean-Injektion. Wenn es eine Klasse, die eine Schnittstelle implementiert, gibt es kein Problem, Beispiel:Wie CDI Proxys für Klassen ohne Schnittstellen einfügt

@SessionScoped 
public class MessageBean implements Message {...} 

Proxy können basierend auf Message-Interface erstellt werden, aber was ist, wenn die Klasse keine Schnittstelle implementiert:

@SessionScoped 
public class MessageBean {...} 

Die Injektion in Servlets funktioniert immer noch:

@WebServlet("/example") 
public class MessageServlet extends HttpServlet { 

    @Inject 
    private MessageBean messageBean; 

so ist die Frage, wie es zum Beispiel durch Weld behandelt wird?

+0

Es erweitert nur die Klasse. – BalusC

+0

Laut [docs] (https://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Proxy.html) gibt es zwei Anweisungen: _ Eine Proxy-Klasse erweitert java.lang.reflect .Proxy_ und _Eine Proxy-Klasse implementiert genau die bei ihrer Erstellung angegebenen Schnittstellen, so dass es möglich ist, einen Proxy ohne Schnittstelle zu erstellen. Nach [this] Thema ist es nur möglich mit CGLIB für http://stackoverflow.com/questions/3291637/alternatives-to-javal-lang-reflect-proxy-for-creating-proxies-of-abstract-classes Beispiel. – swch

+0

hk2 verwendet auch javassist wie cglib scheint, als ob es zu dieser Zeit nicht aktiv gepflegt wird – jwells131313

Antwort

2

Nicht jeder Proxy ist eine Instanz von java.lang.reflect.Proxy, Weld verfügt an diesem Punkt über ein eigenes Proxy-Framework, das jede nicht-finale Klasse unterklassifizieren kann. Weld verwendet javassist auch nicht für die Proxy-Funktion (ältere Versionen, aber 2.x sind intern).

Wenn Sie neugierig sind, um zu sehen, wie es geschieht können Sie das hier finden: https://github.com/weld/core/blob/master/impl/src/main/java/org/jboss/weld/bean/proxy/ProxyFactory.java

Eine Anmerkung - der gesamte Prozess verlässt sich nicht endgültige Methoden und Klassen. Sie werden feststellen, dass sogar die CDI-Spezifikation einen Verweis auf Nicht-Finale enthält.