package de.devsurf.injection.guice.serviceloader; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; import java.util.ServiceLoader; import javax.inject.Inject; import com.google.inject.Injector; import com.google.inject.Provider; public final class MultiServiceLoaderProvider<T> implements Provider<T[]> { private final Class<T> type; @Inject Injector injector; public MultiServiceLoaderProvider(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() */ @SuppressWarnings( { "unchecked" }) @Override public T[] get() { List<T> instances = new ArrayList<T>(); ServiceLoader<T> services = ServiceLoader.load(type); for(T t : services){ injector.injectMembers(t); instances.add(t); } return instances.toArray((T[]) Array.newInstance(type, instances.size())); } public static <T> Provider<T[]> of(Class<T> type) { return new MultiServiceLoaderProvider<T>(type); } }