简体   繁体   中英

Custom injection with standard annotations

Is it possible to perform custom injection with constructor/factory arguments computed based on injection point WITHOUT defining custom annotation ?

Given a code:

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

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

How can I configure guice to use second constructor of Foo ( passing target field ) without modifying Bar .

I know that guice can do custom injections of java.util.logging.Logger with standard @Inject but that seems hardcoded and uses internal api.

You can use injection providers to do it. See https://code.google.com/p/google-guice/wiki/ProviderBindings and https://code.google.com/p/google-guice/wiki/ProvidesMethods . You just have to tell Guice how to instantiate the object when it binds it.

For exemple in a project of mine I tried this :

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;
    }
}

I don't know if it's what you're looking for, but I hope it'll help.

If you want only to use specific constructor, you can use constructor bindings :

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

If you need something more complex, you have to use custom injections .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM