Портативное расширение CDI для внедрения бинов во время выполнения - PullRequest
0 голосов
/ 29 мая 2018

Ссылка на это: http://docs.jboss.org/weld/reference/latest-master/en-US/html_single/#_the_literal_injectiontarget_literal_interface

Следуя инструкциям, приведенным выше, я могу динамически загружать SomeFrameworkComponent.class во время выполнения с помощью некоторого пользовательского ClassLoader.Это выглядит так:

public class CustomClassLoader extends ClassLoader {

    public CustomClassLoader() {

    }

    public Class defineClass(String location, byte[] classData, String name) {

        java.nio.file.Path p = java.nio.file.Paths.get(location);

        try {
            return defineClass(name, Files.readAllBytes(p), 0, classData.length);
        } catch (ClassFormatError | IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

После этого я точно следую инструкциям, начиная с 16.5. The InjectionTarget interface, и все это работает.Однако, если я изменю файл .class и перезагрузлю его, CDI будет возвращать старый каждый раз.Новый класс правильно перезагружен, потому что когда я вызываю newInstance() для класса, возвращенного из defineClass, это будет экземпляр обновленного класса, как и ожидалось.

Если я правильно понимаю, как только бин будет зарегистрирован, он помещается (связывается) в Context, который является контейнером для бобов.Последующие запросы для этого компонента будут извлекать его из этого контейнера.И если я хочу иметь возможность уничтожить его по своему желанию или для каждого запроса получить новый файл из нового файла .class, мне нужно будет создать пользовательский Context, который будет поддерживать это.Правильно?

Если мои предположения верны, то как программно указать мой пользовательский Context, что объект .class должен идти?

...