[英]Guice Provider Interception
我需要訪問通過Guice @Provides提供的實例,所以我正在測試一種通過Interceptor訪問@Provides方法的方法……但是,絕不,攔截器永遠不會散布。 我也不能更改Provider Method Signature,因為它是從另一個類繼承的。
public class MyModule extends AbstractModule{
public static class MyInterceptor implements MethodInterceptor{
@Override
public Object invoke(final MethodInvocation methodInvocation) throws Throwable {
System.out.println("MyModule ::: Intercepted@invoke! : "+ methodInvocation.getMethod().getName());
return methodInvocation.proceed();
}
}
@Provides
StampInterface getStamp(){
StampExampleImpl se = new StampExampleImpl();
se.setId("theID");
se.setTst(System.currentTimeMillis());
return se;
}
@Override
protected void configure() {
bindInterceptor(Matchers.any(),
Matchers.annotatedWith(Provides.class),
new MyInterceptor());
}
public static void main(String... args) {
StampInterface s = Guice.createInjector(new MyModule()).getInstance(StampInterface.class);
System.out.println( s.getTst());
System.out.println("---------------------------");
}
}
請按照以下說明檢查guice aop的限制: https : //github.com/google/guice/wiki/AOP#limitations
實例必須由Guice由帶有@Inject注釋或無參數的構造函數創建。無法對非Guice構造的實例使用方法攔截。
您可以通過“ new”自己創建StampExampleImpl(無關緊要,您可以在Produces方法中創建)。 因此,guice對於攔截不了解。
快速修復:讓guice為您創建impl實例:
@Provides
StampInterface getStamp(StampExampleImpl se){
se.setId("theID");
se.setTst(System.currentTimeMillis());
return se;
}
第二個問題:為什么要匹配“ annotatedWith(Provides)”? 您想攔截StampInterface的getTsd()方法,但未添加注釋。 批注位於模塊的生產者方法上,這是另一回事。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.