CDI如何为没有接口的类注入代理

时间:2016-04-30 10:58:25

标签: cdi jboss-weld weld

据我所知,CDI使用动态代理进行非依赖bean注入。如果有一个实现某个接口的类没有问题,例如:

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

代理可以基于Message接口创建,但是如果该类没有实现接口,那该怎么办呢?

@SessionScoped
public class MessageBean {...}

注入Servlet仍然有效:

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

    @Inject
    private MessageBean messageBean;

所以问题是如何处理它,例如Weld?

1 个答案:

答案 0 :(得分: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

一个注意事项 - 整个过程依赖于非最终方法和类。您会注意到即使是CDI规范也会引用非最终版本。