2016-04-30 7 views
0

Насколько я знаю, CDI использует динамический прокси-сервер для независящей инъекции бобов. Если есть класс, который реализует некоторый интерфейс не существует никаких проблем, например:Как 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 proxy class extends java.lang.reflect .Proxy_ и _A прокси-класс реализует именно интерфейсы, указанные при его создании_, поэтому можно создать прокси без интерфейса? Согласно [this] (http://stackoverflow.com/questions/3291637/alternatives-to-java-lang-reflect-proxy-for-creating-proxies-of-abstract-classes), это возможно только с CGLIB для пример. – 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

Одно замечание - весь процесс опирается неконечное методов и классов. Вы заметите, что даже спецификация CDI делает ссылку на нефинал.