2016-04-30 34 views
0

據我所知,CDI使用動態代理進行非依賴的bean注入。如果有實現了一些接口是沒有問題的,例如一類:CDI如何爲沒有接口的類注入代理

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

代理可以基於消息的接口,但什麼。如果這個類實現無界面創建:

@SessionScoped 
public class MessageBean {...} 

注射進入Servlet仍然有效:

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

    @Inject 
    private MessageBean messageBean; 

所以問題是如何處理,例如Weld?

+0

它只是擴展類。 – BalusC

+0

根據[docs](https://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Proxy.html),有兩條語句:_A代理類擴展java.lang.reflect .Proxy_和_A代理類正好實現了在其creation_指定的接口,因此可以在沒有接口的情況下創建代理?根據[this](http://stackoverflow.com/questions/3291637/alternatives-to-java-lang-reflect-proxy-for-creating-proxies-of-abstract-classes)主題,它只能用於CGLIB for例。 – swch

+0

hk2也使用javassist,因爲cglib好像現在沒有被主動維護 – jwells131313

回答

2

並非每個代理都是java.lang.reflect.Proxy的一個實例,Weld在此處有其自己的代理框架,可以對任何非最終類進行子類化。 Weld也不使用javassist來做代理(舊版本,但是2.x是內部的)。

如果你很好奇,看看它是如何發生的,你可以找到在這裏:https://github.com/weld/core/blob/master/impl/src/main/java/org/jboss/weld/bean/proxy/ProxyFactory.java

一個音符 - 整個過程依靠非final方法和類。你會注意到,即使是CDI規範也會引用非最終的。