package kr.co.inger.hotwind.guice; import java.util.ArrayList; import java.util.List; import kr.co.inger.hotwind.config.AppConfig; import org.apache.commons.configuration.Configuration; import org.apache.commons.lang.ObjectUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Strings; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Module; /** * Guice Injector. * * app.guice-modules으로 지정된 모듈 클래스들을 새로운 인스턴스를 만들어 초기화하고 Guice모듈로 활용한다. * * @author jhyun * @since 2012-08-30 * * @see <a * href="http://google-guice.googlecode.com/git/javadoc/com/google/inject/Module.html">Guice * / Module</a> */ public class Guicer { private static Logger logger = LoggerFactory.getLogger(Guicer.class); private static Injector injector; private static List<Module> modules; public static final List<Module> getModules() { return modules; } static { // 초기화! Configuration config = AppConfig.load(); modules = getModules(config); injector = Guice.createInjector(modules); } /** app.guice-modules에 리스트로 지정된 전체 클래스 경로를 찾아 인스턴스를 생성하고 모듈로 사용. */ private static List<Module> getModules(Configuration config) { List<Object> moduleClassFqns = config.getList("app.guice-modules", new ArrayList<Object>()); logger.debug(String.format("guice-module-class-fqns = %s", moduleClassFqns)); // List<Module> moduleObjs = new ArrayList<Module>(); for (Object moduleClassFqn : moduleClassFqns) { if (Strings.isNullOrEmpty(ObjectUtils.toString(moduleClassFqn))) continue; // try { Class<? extends Module> moduleClass = (Class<? extends Module>) Class .forName((String) moduleClassFqn); Module moduleObj = moduleClass.newInstance(); moduleObjs.add(moduleObj); logger.info(String.format("guice-module bound = [%s]", moduleClass)); } catch (Exception e) { logger.warn( String.format( "app.guice-modules specified guice-module-class not found. -- [%s]", moduleClassFqn), e); } } return moduleObjs; } /** use this! */ public static Injector get() { return injector; } }