Можно ли уничтожить область действия CDI? - PullRequest
9 голосов
/ 23 июня 2011

Я работаю над приложением Java EE, в первую очередь JAX-RS с консолью администратора JSF, которое использует CDI / Weld для внедрения зависимостей с javax.enterprise.context.ApplicationScoped объектами.За исключением мелких проблем с отладкой, CDI прекрасно поработал для этого проекта.

Теперь мне нужен какой-то очень грубый контроль над жизненными циклами объектов, внедренных CDI.Мне нужна возможность:

  • Удалить внедренный объект из контекста приложения или
  • Уничтожить / удалить / очистить / сбросить / удалить весь контекст приложения или
  • Определите мой собственный @ScopeType и реализуйте Context, в котором я мог бы предоставить методы для выполнения одной из двух вышеуказанных задач.

Я полностью осознаю, что этов целом, если не против, фактора CDI и внедрения зависимости вообще.Я просто хочу знать

  • Возможно ли это дистанционно?
  • Если да, то какой самый простой / простой / быстрый / надежный и надежный способ выполнить работу?

Ответы [ 4 ]

4 голосов
/ 04 июля 2011

Справочная документация по сварке Раздел 2.1.2

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

Пример пользовательской области Портирование veiwscopedjsf annonation to cdi

Если вы действительно не хотите указывать путь к типу пользовательской области видимости. Вы можете использовать непереносимый метод, используя Метод BeanManager.getContext и приведение этого контекста в сварном шве AbstractSharedContext , чтобы получить доступ к бобам или методу cleanUp () контекста.

Проверьте эту ветку о том, как получить BeanManager экземпляр для вашей среды

4 голосов
/ 30 августа 2011

Пользовательская область, которая может соответствовать вашим потребностям, доступна по адресу https://github.com/openknowledge/openknowledge-cdi-extensions/tree/master/openknowledge-cdi-scope/src/main/java/de/openknowledge/cdi/scope Возможно, вам придется немного скорректировать реализацию.

1 голос
/ 16 июня 2014

В CDI 1.1 есть интерфейс javax.enterprise.context.spi.AlterableContext, который позволяет вам по отдельности уничтожить экземпляр компонента. Все обычные области действия (запрос, разговор, сеанс) могут быть изменены.

AlterableContext ctxConversation = (AlterableContext) beanManager.getContext(ConversationScoped.class);
for (Bean<?> bean : beanManager.getBeans(Object.class)) {
    Object instance = ctxConversation.get(bean);
    if (instance != null) {
        ctxConversation.destroy(instance);
    }
}

beanManager - это экземпляр javax.enterprise.inject.spi.BeanManager. Вы можете получить его через поиск JNDI:

InitialContext.doLookup("java:comp/BeanManager");

или статическим методом CDI:

CDI.current().getBeanManager();

, но имейте в виду проблемы со статическим методом в некоторых версиях Weld:

1 голос
/ 01 июля 2011

Из коробки есть только область беседы, которая дает вам полный контроль над его жизненным циклом. Но вы можете создать свою собственную сферу, если разговор не соответствует вашим потребностям. Создание области - сложная задача, но вы можете перейти к сварке кода и посмотреть, как реализован диалог.

...