Search code examples
annotationsguiceprovider

guice ignores providers?


It seems Guice is ignoring my @Provider methods of my module.

I have a class MyModule like this:

public class MyModule extends AbstractModule {

    protected void configure() {

        bindInterceptor(Matchers.any(), Matchers.annotatedWith(Timed.class), new GuiceEnabledLoggingInterceptor());
        bind(OneClass.class).to(OneClassImpl.class);

        // And more binding lines...

    }

    @Provides
    public AnotherClassInApi provideMyClass() {
        return AnotherClassInApi.getInstance();
    }

    // And more @Provides methods

}

Main method is

public static void main(String[] args){
    ConfigHandler.getInstance().loadConfigWhenNotRunningInsideMicrocontainer();
    Injector INJECTOR = Guice.createInjector(new MyModule());
    // ...
}

In some other part of the project I have class AnotherClassInApi, which is a very standard singleton plus one method:

public class AnotherClassInApi {

    private static final AnotherClassInApi INSTANCE = new AnotherClassInApi();

    private AnotherClassInApi() { }

    // ... more methods

    public static AnotherClassInApi getInstance() {
        return INSTANCE;
    }
}

Well, I understand that should effectively bind any request for an AnotherClassInApi object to the getInstance() method, but it doesn't work. Funny thing, a breakpoint in the @Provide method is never reached while debugging, but one in the configure method is reached. It seems guice is ignoring my provider annotation, and I think I'm following exactly what Guice guide says about @Provider, so I'm already stuck.

I've been googling around, but can't find anything similar. Any help will be much appreciated.

Thanks!


Solution

  • The concept of Providers (and @Provides methods) is, that they are only called when actually needed. So unless you really use your Injector to create an instance that has an @Inject dependency, your Provider is not ignored, just not used (nor needed).

    You can monitor all configured bindings by using "injector.getAllBindings()".

    java.util.Map,Binding> getAllBindings()

    Returns a snapshot of this injector's bindings, both explicit and just-in-time. The returned map is immutable; it contains only the bindings that were present when getAllBindings() was invoked. Just-in-time bindings are only present if they have been requested at least once. Subsequent calls may return a map with additional just-in-time bindings. The returned map does not include bindings inherited from a parent injector, should one exist.

    This method is part of the Guice SPI and is intended for use by tools and extensions.