package tc.oc.commons.core.inject; import java.util.logging.Logger; import com.google.inject.AbstractModule; import com.google.inject.TypeLiteral; import com.google.inject.internal.Errors; import com.google.inject.matcher.Matchers; import com.google.inject.spi.InjectionListener; import com.google.inject.spi.ProvisionListener; import com.google.inject.spi.TypeEncounter; import com.google.inject.spi.TypeListener; /** * Debugging tool - logs all injection activity (very spammy) */ public class InjectionLogger implements TypeListener, ProvisionListener { private final Logger logger; public InjectionLogger(Logger logger) { this.logger = logger; } @Override public <I> void hear(TypeLiteral<I> type, TypeEncounter<I> encounter) { logger.info("Encountered type " + type); encounter.register((InjectionListener<I>) injectee -> { logger.info("Injected " + injectee); }); } @Override public <T> void onProvision(ProvisionInvocation<T> provision) { logger.info("Provisioning " + provision.provision() + " for key " + provision.getBinding().getKey() + " bound at " + Errors.convert(provision.getBinding().getSource())); } public static class Module extends AbstractModule { private final Logger logger; public Module(Logger logger) { this.logger = logger; } @Override protected void configure() { final InjectionLogger listener = new InjectionLogger(logger); bindListener(Matchers.any(), (TypeListener) listener); bindListener(Matchers.any(), (ProvisionListener) listener); } } }