Расширение провайдера - PullRequest
       20

Расширение провайдера

0 голосов
/ 24 февраля 2011

Мне нужно создать провайдера для областей сеанса, например ServletScopes.SESSION, но с одним дополнительным действием после построения объекта (например, добавить слушателя).Первая идея - расширить ServletScopes.SESSION и переопределить некоторый метод, но, к сожалению, ServletScopes.SESSION это объект, а не класс.Итак, как я могу получить такого провайдера без копирования-вставки кода из ServletScopes?

1 Ответ

1 голос
/ 24 февраля 2011

Сначала создайте аннотацию:

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Target({TYPE, METHOD})
@Retention(RUNTIME)
public @interface AfterInjectionListener
{
}

Затем аннотируйте каждый класс, который реализует метод afterInjection (), с аннотацией и добавьте эту привязку к одному из ваших модулей Guice:

bindListener(Matchers.any(), new TypeListener()
{
  @Override
  public <I> void hear(TypeLiteral<I> typeLiteral, TypeEncounter<I> iTypeEncounter)
  {
    if (typeLiteral.getRawType().isAnnotationPresent(AfterInjectionListener.class))
    {
      logger.debug("adding injection listener {}", typeLiteral);
      iTypeEncounter.register(new InjectionListener<I>()
      {
        @Override
        public void afterInjection(I i)
        {
          try
          {
            logger.debug("after injection {}", i);
            i.getClass().getMethod("afterInjection").invoke(i);
          } catch (NoSuchMethodException e)
          {
            logger.trace("no such method", e);
          } catch (Exception e)
          {
            logger.debug("error after guice injection", e);
          }
        }
      });
    }
  }
});

Поместите точку останова в метод afterInjection(), запустите приложение в режиме отладки и проверьте, вызывается ли метод после внедрения.

...