2016-04-30 35 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规范也会引用非最终的。