package com.ctrip.framework.foundation; import com.ctrip.framework.foundation.internals.NullProviderManager; import com.ctrip.framework.foundation.internals.ServiceBootstrap; import com.ctrip.framework.foundation.spi.ProviderManager; import com.ctrip.framework.foundation.spi.provider.ApplicationProvider; import com.ctrip.framework.foundation.spi.provider.NetworkProvider; import com.ctrip.framework.foundation.spi.provider.ServerProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public abstract class Foundation { private static final Logger logger = LoggerFactory.getLogger(Foundation.class); private static Object lock = new Object(); private static volatile ProviderManager s_manager; // Encourage early initialization and fail early if it happens. static { getManager(); } private static ProviderManager getManager() { try { if (s_manager == null) { // Double locking to make sure only one thread initializes ProviderManager. synchronized (lock) { if (s_manager == null) { s_manager = ServiceBootstrap.loadFirst(ProviderManager.class); } } } return s_manager; } catch (Throwable ex) { s_manager = new NullProviderManager(); logger.error("Initialize ProviderManager failed.", ex); return s_manager; } } public static String getProperty(String name, String defaultValue) { try { return getManager().getProperty(name, defaultValue); } catch (Throwable ex) { logger.error("getProperty for {} failed.", name, ex); return defaultValue; } } public static NetworkProvider net() { try { return getManager().provider(NetworkProvider.class); } catch (Exception ex) { logger.error("Initialize NetworkProvider failed.", ex); return NullProviderManager.provider; } } public static ServerProvider server() { try { return getManager().provider(ServerProvider.class); } catch (Exception ex) { logger.error("Initialize ServerProvider failed.", ex); return NullProviderManager.provider; } } public static ApplicationProvider app() { try { return getManager().provider(ApplicationProvider.class); } catch (Exception ex) { logger.error("Initialize ApplicationProvider failed.", ex); return NullProviderManager.provider; } } }