0
我需要爲會話作用域創建提供程序,如ServletScopes.SESSION
,但在對象構建之後還有一個額外操作(如添加偵聽程序)。第一個想法 - 擴展ServletScopes.SESSION
並重寫一些方法,但不幸的是,ServletScopes.SESSION
是對象,而不是類。那麼,我如何才能在沒有從ServletScopes複製粘貼代碼的情況下獲得這樣的提供者?提供程序擴展
我需要爲會話作用域創建提供程序,如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
{
}
然後,標註每一個實現方法`再噴射()」與註釋類,並添加此綁定到你的吉斯模塊之一:
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()
方法中放置斷點,在調試模式下運行應用程序,並檢查注入後是否調用該方法。
好的。謝謝。但是,對於這麼簡單的動作,很多代碼似乎都是這樣) – 2011-02-24 16:35:52
我們必須忍受這麼多代碼,直到Guice實現Java的標準註解@AfterInjection的權利。也許用Guice 3.0。我們拭目以待 – 2011-02-25 08:09:35