提供者扩展

时间:2011-02-24 11:18:53

标签: java guice provider guice-servlet

我需要为会话范围创建提供程序,例如ServletScopes.SESSION,但是在构造对象之后有一个额外的操作(比如添加侦听器)。第一个想法 - 扩展ServletScopes.SESSION并覆盖某些方法,但不幸的是ServletScopes.SESSION是对象,而不是类。那么,如何在不使用ServletScopes的代码粘贴代码的情况下获得此类提供程序?

1 个答案:

答案 0 :(得分:1)

首先创建一个注释:

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()方法中放置一个断点,在调试模式下运行应用程序并检查注入后是否调用该方法。