content: package com.ctrip.framework.apollo.internals;
  
  import com.ctrip.framework.apollo.exceptions.ApolloConfigException;
  import com.ctrip.framework.apollo.spi.ConfigFactory;
  import com.ctrip.framework.apollo.spi.ConfigFactoryManager;
  import com.ctrip.framework.apollo.spi.ConfigRegistry;
  import com.ctrip.framework.apollo.spi.DefaultConfigFactory;
  import com.ctrip.framework.apollo.spi.DefaultConfigFactoryManager;
  import com.ctrip.framework.apollo.spi.DefaultConfigRegistry;
  import com.ctrip.framework.apollo.spring.config.ConfigPropertySourceFactory;
  import com.ctrip.framework.apollo.spring.property.PlaceholderHelper;
  import com.ctrip.framework.apollo.tracer.Tracer;
  import com.ctrip.framework.apollo.util.ConfigUtil;
  import com.ctrip.framework.apollo.util.http.HttpUtil;
  
  import com.google.inject.AbstractModule;
  import com.google.inject.Guice;
  import com.google.inject.Singleton;
  
  /**
   * Guice injector
   * @author Jason Song(song_s@ctrip.com)
   */
  public class DefaultInjector implements Injector {
    private com.google.inject.Injector m_injector;
  
    public DefaultInjector() {
      try {
        m_injector = Guice.createInjector(new ApolloModule());
      } catch (Throwable ex) {
        ApolloConfigException exception = new ApolloConfigException("Unable to initialize Guice Injector!", ex);
        Tracer.logError(exception);
        throw exception;
      }
    }
  
    @Override
    public <T> T getInstance(Class<T> clazz) {
      try {
        return m_injector.getInstance(clazz);
      } catch (Throwable ex) {
        Tracer.logError(ex);
        throw new ApolloConfigException(
            String.format("Unable to load instance for %s!", clazz.getName()), ex);
      }
    }
  
    @Override
    public <T> T getInstance(Class<T> clazz, String name) {
      //Guice does not support get instance by type and name
      return null;
    }
  
    private static class ApolloModule extends AbstractModule {
      @Override
      protected void configure() {
        bind(ConfigManager.class).to(DefaultConfigManager.class).in(Singleton.class);
        bind(ConfigFactoryManager.class).to(DefaultConfigFactoryManager.class).in(Singleton.class);
        bind(ConfigRegistry.class).to(DefaultConfigRegistry.class).in(Singleton.class);
        bind(ConfigFactory.class).to(DefaultConfigFactory.class).in(Singleton.class);
        bind(ConfigUtil.class).in(Singleton.class);
        bind(HttpUtil.class).in(Singleton.class);
        bind(ConfigServiceLocator.class).in(Singleton.class);
        bind(RemoteConfigLongPollService.class).in(Singleton.class);
        bind(PlaceholderHelper.class).in(Singleton.class);
        bind(ConfigPropertySourceFactory.class).in(Singleton.class);
      }
    }
  }
  