据我所知,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?
答案 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规范也会引用非最终版本。