java - how to use guice injector in a guice provider? -


i'm using guice inject dependencies.

i have provider:

public class requesturlrepository implements provider<irequesturlrepository> {       @singleton     @override     public irequesturlrepository get() {         irequesturlrepository answer = null;         if (system.getproperty("").equals(routeorcostrequest.cost.tostring())){             answer = new costrequesturlrepository(...);         }         else         {             answer = new routingrequesturlrepository(...);         }           return answer;     } } 

how can use guice injector fill new costrequesturlrepository(...); , new routingrequesturlrepository(...) when it's in provider?

if not possible, how can init them without manually creating ctor's params?

providers can accept @inject-annotated constructors , fields, , guice's built-in bindings let inject both injector , provider key injector can provide (e.g. provider<costrequesturlrepository>).

@singleton public class requesturlrepository implements provider<irequesturlrepository> {      @inject provider<costrequesturlrepository> costrepositoryprovider;     @inject provider<routingrequesturlrepository> routingrepositoryprovider;     @inject injector injector;      @override public irequesturlrepository get() {         irequesturlrepository answer = null;         if (system.getproperty("").equals(routeorcostrequest.cost.tostring())){             return costrepositoryprovider.get();         } else {             return routingrepositoryprovider.get();         }          // alternatively:         return injector.getinstance(class.forname(system.getproperty("")));     } } 

note @singleton annotation goes on class, not method; per guice mailing list "scope annotations apply providers whole, annotating get() method @singleton erroneous , ignored." (link).

ideally, rather injecting entire injector, should inject each provider; should make easier see system's dependencies, , you're relying less on guice , more on general jsr330 annotations. however, if have instantiate arbitrary class based on name or class literal in variable, injecting injector way go.


Comments