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

给定接口:
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);

最佳答案

这是您可以执行此操作的一种方法:

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方法。

我可能还没有想到更好的方法。还要记住,方法拦截通常也是用其他行为来装饰接口实现的好方法。

关于java - Guice包装通用注入(inject)剂,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4018431/

10-10 03:06