带标准注释的自定义注入

时间:2013-08-05 15:12:28

标签: java dependency-injection guice

是否可以使用基于注入点计算的构造函数/工厂参数执行自定义注入而不定义自定义注释?

给出一个代码:

class Foo {
  public Foo() {}
  public Foo(java.lang.reflect.Field field) {}
}

class Bar {
  @javax.inject.Inject Foo foo;
}

如何配置guice以使用Foo的第二个构造函数(传递目标字段)而不修改Bar

我知道guice可以使用标准的@Inject自定义注入java.util.logging.Logger,但这似乎是硬编码并使用内部api。

2 个答案:

答案 0 :(得分:1)

您可以使用注射提供程序来执行此操作。请参阅https://code.google.com/p/google-guice/wiki/ProviderBindingshttps://code.google.com/p/google-guice/wiki/ProvidesMethods。你必须告诉Guice在绑定它时如何实例化对象。

例如,在我的一个项目中,我试过这个:

public static class CalendarServiceProvider implements Provider<CalendarService> {
    @Inject
    GAppsOAuth oauth;
    private GCalendarService service;

    @Override
    public CalendarService get() {
        if (service == null) {
            service = new GCalendarService(oauth);
        }
        return service;
    }
}

我不知道这是不是你想要的,但我希望它会有所帮助。

答案 1 :(得分:-1)

如果您只想使用特定的构造函数,可以使用constructor bindings

bind(Foo.class).toConstructor(Foo.class.getConstructor(java.lang.reflect.Field.class));

如果您需要更复杂的内容,则必须使用custom injections