CDI — Написание пользовательских контекстов и областей

Я хотел бы иметь свои собственные контексты для некоторых проектов на основе CDI. Мне нужны (хочу) настраиваемые области, чтобы я мог изолировать, как долго живет компонент и где.

Чтобы реализовать свой собственный контекст, вам нужно реализовать интерфейс Context, который не требует пояснений, но как и где вы на самом деле определяете, когда он создается?


person Community    schedule 25.09.2010    source источник


Ответы (2)


Я еще не проверял это, но я верю, что это сработает. Для каждой пользовательской области/контекста, которую вы хотите использовать в своем приложении, вам просто нужно добавить этот контекст через расширение при инициализации контейнера:

public void afterBeanDiscovery(@Observes AfterBeanDiscover afterBeanDiscovery, BeanManager beanManager)
{
  CustomContext customContext = new CustomContext();
  afterBeanDiscovery.addContext(customContext);

  beanManager ...
}

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

@Inject
protected HttpRequestLifecycle httpRequestLifecycle;

public void doSomething()
{
  startContext();
  doStuff();
  stopContext();
}

public void startContext()
{
  httpRequestContextLifecycle.getHttpRequestContext().activate();
}

Это должно сделать это, там не так много документации, поэтому я надеюсь, что это поможет.

Кому интересно, ознакомьтесь с исходным кодом здесь: http://github.com/walterjwhite/server.web.application

Уолтер

person Community    schedule 26.09.2010
comment
На самом деле, это меня очень сблизило. Даже после того, как я запустил контекст, установив его активным, я все равно получаю No Contexts Active для области... - person ; 27.09.2010
comment
Еще одно замечание: вы не можете внедрить контекст, если не сделаете его одноэлементным. Если это область приложения, у вас нет гарантии, что вы получите тот же контекст, что и в карте контекстов. Это означает, что контекст, который вы активируете, является фиктивным контекстом, он ничего не контролирует. В итоге я сохранил ссылку на него в своих классах управления жизненным циклом, а затем внедрил этот жизненный цикл и получил контекст. - person ; 28.09.2010
comment
Если бы это был @Singleton, как бы вы различали несколько запросов? Разве вы не должны создавать и активировать контекст где-то в прослушивателе контекста? - person Ondra Žižka; 15.07.2011

Прочтите эту статью о DZone: Пользовательские области видимости в CDI 1.0 и Spring 3.1 (нижняя половина)

person Ondra Žižka    schedule 16.07.2011