package com.netflix.governator; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; import com.google.inject.AbstractModule; import com.google.inject.matcher.Matchers; import com.google.inject.spi.ProvisionListener; import com.netflix.governator.annotations.SuppressLifecycleUninitialized; import com.netflix.governator.spi.LifecycleListener; /** * Adds support for detection and invocation of {@link LifecycleListener} instances. */ public final class LifecycleListenerModule extends AbstractModule { private LifecycleListenerProvisionListener provisionListener = new LifecycleListenerProvisionListener(); @Override protected void configure() { requestStaticInjection(LifecycleListenerProvisionListener.class); bind(LifecycleListenerProvisionListener.class).toInstance(provisionListener); bindListener(Matchers.any(), provisionListener); } @Singleton @SuppressLifecycleUninitialized static class LifecycleListenerProvisionListener implements ProvisionListener { private LifecycleManager manager; private List<LifecycleListener> pendingLifecycleListeners = new ArrayList<>(); @Inject public static void initialize(LifecycleManager manager, LifecycleListenerProvisionListener provisionListener) { provisionListener.manager = manager; for (LifecycleListener l : provisionListener.pendingLifecycleListeners) { manager.addListener(l); } provisionListener.pendingLifecycleListeners.clear(); } @Override public String toString() { return "LifecycleListenerProvisionListener[]"; } @Override public <T> void onProvision(ProvisionInvocation<T> provision) { final T injectee = provision.provision(); if (injectee != null && injectee instanceof LifecycleListener) { if (manager == null) { pendingLifecycleListeners.add((LifecycleListener) injectee); } else { manager.addListener((LifecycleListener) injectee); } } } } @Override public boolean equals(Object obj) { return getClass()==obj.getClass(); } @Override public int hashCode() { return getClass().hashCode(); } @Override public String toString() { return "LifecycleListenerModule[]"; } }