java - 提供者扩展

标签 java guice provider guice-servlet

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

最佳答案

首先创建一个注释:

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()”方法的每个类进行注释,并将此绑定(bind)添加到您的 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() 方法中放置一个断点,在 Debug模式下运行应用程序并检查注入(inject)后是否调用该方法。

关于java - 提供者扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5103908/

相关文章:

scala - 玩!斯卡拉 : How to disable actor modules loaded at the start of the application when testing?

c# - 使用 asp.net 成员(member)提供程序如何检查用户是否已注册?

java使用synchronized关键字的等待通知方法

java - JPA:没有 @OneToMany 注释的左连接

guice - 结合@Provides 和@Inject

android - 是否可以允许用户在存储访问框架中选择多个文件..?

java - Resteasy 没有找到 ExceptionMapper 提供者

java - 将整个存档解压缩到 java 目录的实用程序

java - 如何收听 JTextArea

java - 使用 Guice 在实现使用泛型时如何绑定(bind)参数化类的多个实例?