2011-02-24 69 views
0

我需要为会话作用域创建提供程序,如ServletScopes.SESSION,但在对象构建之后还有一个额外操作(如添加侦听程序)。第一个想法 - 扩展ServletScopes.SESSION并重写一些方法,但不幸的是,ServletScopes.SESSION是对象,而不是类。那么,我如何才能在没有从ServletScopes复制粘贴代码的情况下获得这样的提供者?提供程序扩展

回答

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 
{ 
} 

然后,标注每一个实现方法`再喷射()”与注释类,并添加此绑定到你的吉斯模块之一:

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

+0

好的。谢谢。但是,对于这么简单的动作,很多代码似乎都是这样) – 2011-02-24 16:35:52

+0

我们必须忍受这么多代码,直到Guice实现Java的标准注解@AfterInjection的权利。也许用Guice 3.0。我们拭目以待 – 2011-02-25 08:09:35

相关问题