package com.netflix.governator.visitors; import com.google.inject.Binding; import com.google.inject.spi.DefaultBindingTargetVisitor; import com.google.inject.spi.DefaultElementVisitor; import com.google.inject.spi.InstanceBinding; /* * Specialized {@link DefaultElementVisitor} that formats a warning for any toInstance() binding. * Use this with {@link InjectorBuilder#forEachElement} to identify situations where toInstance() bindings * are used. The assertion here is that toInstance bindings are an indicator of provisioning being * done outside of Guice and could involve static initialization that violates ordering guarantees * of a DI framework. The recommendation is to replace toInstance() bindings with @Provides methods. */ public final class WarnOfToInstanceInjectionVisitor extends DefaultElementVisitor<String> { public <T> String visit(Binding<T> binding) { return binding.acceptTargetVisitor(new DefaultBindingTargetVisitor<T, String>() { public String visit(InstanceBinding<? extends T> instanceBinding) { return String.format("toInstance() at %s can force undesireable static initialization. " + "Consider replacing with an @Provides method instead.", instanceBinding.getSource()); } }); } }