package org.sdif4j.pico2; import org.picocontainer.PicoContainer; import org.sdif4j.InjectContext; import javax.inject.Inject; import javax.inject.Provider; import java.lang.reflect.Field; /** * Base Pico 2 InjectContext implementation * * @author Sergey Chernov */ public abstract class AbstractPico2InjectContext implements InjectContext { protected abstract PicoContainer getPicoContainer(); public <T> Provider<T> getProvider(final Class<T> clazz) { return new Provider<T>() { public T get() { // final PicoContainer pc = getPicoContainer(); // return clazz.cast(pc.getComponentAdapter(clazz).getComponentInstance(pc, clazz)); return getInstance(clazz); } }; } public <T> T getInstance(Class<T> clazz) { return getPicoContainer().getComponent(clazz); } public <T> T getInstance(Class<T> clazz, String name) { return clazz.cast(getPicoContainer().getComponent(name)); } public void injectMembers(Object instance) { final PicoContainer pc = getPicoContainer(); final Class<?> clazz = instance.getClass(); for (Field field : clazz.getDeclaredFields()) { if (field.isAnnotationPresent(Inject.class)) { Object value = pc.getComponent(field.getType()); try { field.setAccessible(true); field.set(instance, value); } catch (IllegalArgumentException e) { throw new RuntimeException("Error while injecting field " + field.getName(), e); } catch (IllegalAccessException e) { throw new RuntimeException("Error while injecting field " + field.getName(), e); } } } } }