【问题标题】:Provider extending提供者扩展
【发布时间】:2011-02-24 11:18:53
【问题描述】:

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

【问题讨论】:

    标签: java guice provider guice-servlet


    【解决方案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()方法内部下断点,在调试模式下运行应用,检查注入后是否调用了该方法。

    【讨论】:

    • 好的。谢谢。但是这样简单的操作似乎有很多代码)
    • 在 Guice 正确实现 Java 的标准注解 @AfterInjection 之前,我们将不得不忍受这么多代码。也许使用 Guice 3.0。我们会看到
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 2017-04-26
    • 2021-05-27
    • 2020-05-08
    • 2013-04-28
    相关资源
    最近更新 更多