Java 带有标准注释的自定义注入

Java 带有标准注释的自定义注入,java,dependency-injection,guice,Java,Dependency Injection,Guice,在不定义自定义注释的情况下,是否可以使用基于注入点计算的构造函数/工厂参数执行自定义注入 给定一个代码: class Foo { public Foo() {} public Foo(java.lang.reflect.Field field) {} } class Bar { @javax.inject.Inject Foo foo; } 如何配置guice以使用Foo(通过目标字段)的第二个构造函数而不修改栏 我知道guice可以使用标准@Inject对java.util.l

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

给定一个代码:

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

class Bar {
  @javax.inject.Inject Foo foo;
}
如何配置guice以使用
Foo
通过目标字段)的第二个构造函数而不修改


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

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


如果您需要更复杂的东西,您必须使用。

您可以使用注入提供者来完成。见和。您只需告诉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;
    }
}
公共静态类CalendarServiceProvider实现提供程序{
@注入
加普索斯奥阿斯;
私人GCalendar服务;
@凌驾
公共日历服务get(){
if(服务==null){
服务=新的GCalendarService(oauth);
}
回程服务;
}
}

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

我想要“目标字段”,是的,这是一个自定义注入。我的问题是如何在没有自定义注释的情况下完成它。@MarcinWisnicki,从你的问题中不太清楚你想做什么。如果您只想创建
Foo
手动指定其参数,但仍然允许
Foo
参与依赖项注入,则必须使用,这正是为此目的而设计的。如果您有更复杂的场景(有些参数必须手动指定,有些参数必须由Guice注入),那么您可以使用。@MarcinWisnicki,我似乎理解您的需要。您需要将目标字段注入正在该字段中注入的对象,对吗?这确实应该通过自定义注入来完成,但我相信没有自定义注释就无法完成,因为
@Inject
是由Guice专门处理的。正如您已经注意到的,
j.u.l.Logger
injection是在Guice core中硬编码的,这是一个例外。正如我在问题中提到的(甚至用粗体字母),我需要目标字段(即injection context)。
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;
    }
}