package de.devsurf.injection.guice.serviceloader;
import java.util.Iterator;
import java.util.ServiceLoader;
import javax.inject.Inject;
import com.google.inject.Provider;
public final class SingleServiceLoaderProvider<T> implements Provider<T> {
private final Class<T> type;
@Inject
com.google.inject.Injector injector;
public SingleServiceLoaderProvider(Class<T> type) {
this.type = type;
}
/*
* Generated classes can't be used with AOP, because only instances created
* by Guice are extended with AOP. Maybe this will be fixed later in Guice.
* @see com.google.inject.Provider#get()
*/
@Override
public T get() {
ServiceLoader<T> services = ServiceLoader.load(type);
Iterator<T> iterator = services.iterator();
if(iterator.hasNext()){
T instance = iterator.next();
injector.injectMembers(instance);
return instance;
}
return null;
}
public static <T> Provider<T> of(Class<T> type) {
return new SingleServiceLoaderProvider<T>(type);
}
}