package tc.oc.commons.core.inject; import java.util.List; import javax.inject.Inject; import javax.inject.Provider; import com.google.inject.Binder; import com.google.inject.Injector; import com.google.inject.TypeLiteral; import com.google.inject.spi.ProviderWithDependencies; import tc.oc.commons.core.stream.Collectors; public class InjectingFactory<T> extends MemberInjectingFactory<T> implements ProviderWithDependencies<T> { private final List<Provider<?>> providers; @Inject public InjectingFactory(Injector injector, TypeLiteral<T> type) { super(type, injector.getMembersInjector(type)); this.providers = injectionPoint.getDependencies() .stream() .map(dep -> injector.getProvider(dep.getKey())) .collect(Collectors.toImmutableList()); dependencies.addAll(injectionPoint.getDependencies()); } public InjectingFactory(Binder binder, TypeLiteral<T> type) { super(type, binder.getMembersInjector(type)); this.providers = injectionPoint.getDependencies() .stream() .map(binder::getProvider) .collect(Collectors.toImmutableList()); dependencies.addAll(injectionPoint.getDependencies()); } @Override public T get() { final Object[] args = new Object[providers.size()]; for(int i = 0; i < args.length; i++) { args[i] = providers.get(i).get(); } return newInstance(args); } }