Guice包装通用注射

时间:2010-10-25 20:10:45

标签: java dependency-injection guice

是否可以以某种方式包装通用注射?

鉴于界面:

interface IFoo<T>

在我的guice模块中:

bind((Key<IFoo<SomeType>) Key.get(Types.newParameterizedType(IFoo.class, SomeType.class))).to(Foo.class);

但在我返回Foo实例之前,我想用它包装它:

class FooWrapper<T> implements IFoo<T> { public FooWrapper(Foo<T> foo) { ... } }

在这样的地方:

return new FooWrapper<T>(foo);

1 个答案:

答案 0 :(得分:2)

这是你可以做到这一点的一种方式:

public class FooModule extends PrivateModule {
  @Retention(RUNTIME) @BindingAnnotation
  private @interface Internal {}

  @Override protected void configure() {
    bind(new TypeLiteral<IFoo<SomeType>>(){}).annotatedWith(Internal.class)
        .to(new TypeLiteral<Foo<SomeType>>(){});
  }

  @Provides @Exposed IFoo<SomeType> provideFoo(@Internal IFoo<SomeType> foo) {
    return new FooWrapper<SomeType>(foo);
  }
}

可能效果很好的另一件事是添加像@Wrapped这样的通用注释,然后像这样声明FooWrapper的构造函数:

@Inject public FooWrapper(@Wrapped IFoo<T> foo) { ... }

然后在您的私有模块中,您可以绑定Foo注释@Wrapped并正常绑定和公开FooWrapper,而无需使用@Provides方法。

我可能还有更好的方法可以解决这个问题。还要记住,方法拦截通常也是用其他行为来装饰接口实现的好方法。